如何在Emacs Lisp中检查字符串是否为空?

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)) - Stefan
5个回答

55

由于在elisp中,字符串是一个整数数组,因此您可以使用

(= (length user-str) 0)
你还可以使用(string=),这通常更容易阅读
(string= "" user-str)

使用Equal也可以,但速度会慢一些:

(equal "" user-str)

1
你确定 equal 更慢吗?上次我看这个(很多年前),它的速度介于“完全相同”和“稍微快一点”之间。 - Stefan

9

从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,但两个调用都会抛出“符号的函数定义为空”的错误。 - miguelmorin
1
尝试在文件的早些位置放置(require 'subr-x)。这对我解决了问题。 - Cadence

7
如果您的代码中大量使用字符串,我强烈建议使用Magnar Sveen的字符串操作库s.els-blank?可检查字符串是否为空:
(s-blank? "") ; => t

6

我把这个函数保存在我的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))

3

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

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

EmacsWiki的elisp食谱提供了一个修剪函数的示例,如果您想在测试之前删除空格。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接