【问题标题】:How to check if a string is empty in Emacs Lisp?如何检查 Emacs Lisp 中的字符串是否为空?
【发布时间】:2009-06-19 19:57:39
【问题描述】:

我想写一个 if 语句,它会根据字符串是否为空来做一些事情。例如:

(defun prepend-dot-if-not-empty (user-str)
   (interactive "s")
   (if (is-empty user-str)
     (setq user-str (concat "." user-str)))
   (message user-str))

在这个人为的示例中,我使用 (is-empty) 代替真正的 elisp 方法。这样做的正确方法是什么?

谢谢

【问题讨论】:

  • 你的代码最好改写成(message "%s" (if (is-empty user-str) "." user-str))

标签: emacs elisp


【解决方案1】:

由于在 elisp 中,String 是一个 int 数组,所以可以使用

(= (length user-str) 0)

您也可以使用通常更容易阅读的 (string=)

(string= "" user-str)

Equal 也可以,但会慢一些:

(equal "" user-str)

【讨论】:

  • 确定 equal 更慢吗?上次我看这个(很多年前),它介于“相同”和“有点快”之间。
【解决方案2】:

从 emacs 24.4 开始,您可以调用两个不同的函数,具体取决于您所说的“空”。

(string-empty-p " ")
nil

(string-blank-p " ")
0

我无法找到要链接的文档,但emacsredux.com 有更多信息。

如果您收到错误Symbol's function definition is void.,请在初始化文件中包含(require 'subr-x)(这是一个用于修剪和字符串操作的包)。

【讨论】:

  • 我有 Emacs 26.3,两个调用都抛出 Symbol's function definition is void.
  • @miguelmorin:尝试将(require 'subr-x) 放在文件前面的某个位置。这为我解决了问题。
【解决方案3】:

如果您在代码中大量使用字符串,我强烈建议您使用 Magnar Sveen 的 s.el 字符串操作库。

s-blank? 检查字符串是否为空:

(s-blank? "") ; => t

【讨论】:

    【解决方案4】:

    我把这个保存在我的utils.lisp

    (defun empty-string-p (string)
      "Return true if the STRING is empty or nil. Expects string type."
      (or (null string)
          (zerop (length (string-trim string)))))
    

    然后我做:

    (not (empty-string-p some-string))
    

    【讨论】:

      【解决方案5】:

      我不确定测试的规范方法是什么,但您可以使用 length 函数并检查字符串的长度是否大于零:

      (length "abc")  
      => 3
      (length "")  
      => 0
      

      如果您想在测试之前删除空格,EmacsWiki elisp 食谱有 an example of a trim function

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-19
        • 2011-11-25
        • 2012-03-23
        • 2015-06-12
        • 2015-10-29
        相关资源
        最近更新 更多