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

one*_*elf 29 emacs elisp

我想编写一个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))
Run Code Online (Sandbox Code Playgroud)

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

谢谢

mih*_*ihi 40

因为在elisp中,String是一个int数组,所以你可以使用

(= (length user-str) 0)
Run Code Online (Sandbox Code Playgroud)

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

(string= "" user-str)
Run Code Online (Sandbox Code Playgroud)

同样有效,但有点慢:

(equal "" user-str)
Run Code Online (Sandbox Code Playgroud)


小智 7

从 emacs 24.4 开始,有两种不同的函数可供您调用,具体取决于“空”的含义。

(string-empty-p " ")
nil

(string-blank-p " ")
0
Run Code Online (Sandbox Code Playgroud)

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

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


Mir*_*lov 5

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

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

(s-blank? "") ; => t
Run Code Online (Sandbox Code Playgroud)


Joe*_*Joe 5

我把这个放在我的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)))))
Run Code Online (Sandbox Code Playgroud)

然后我做:

(not (empty-string-p some-string))
Run Code Online (Sandbox Code Playgroud)