gpt4 book ai didi

emacs - 在 Emacs lisp 中检查一个字符串是否全部大写?

转载 作者:太空宇宙 更新时间:2023-11-03 18:37:06 24 4
gpt4 key购买 nike

全部。我想知道 Emacs lisp 是否有一个内置函数来检查字符串是否完全由大写字符组成。这是我现在正在使用的:

(setq capital-letters (string-to-list "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))

(defun chars-are-capitalized (list-of-characters)
"Returns true if every character in a list of characters is a capital
letter. As a special case, the empty list returns true."
(cond
((equal list-of-characters nil) t)
((not (member (car list-of-characters) capital-letters)) nil)
(t (chars-are-capitalized (cdr list-of-characters)))))

(defun string-is-capitalized (string)
"Returns true if every character in a string is a capital letter. The
empty string returns true."
(chars-are-capitalized (string-to-list string)))

它工作正常(虽然它依赖于我将只使用 ASCII 字符的假设),但我想知道我是否遗漏了一些我应该知道的明显功能。

最佳答案

引用其他答案:

  1. 使用 upcase 不是一个好主意:它会分配一个新的字符串,它不会查找字符串是否包含非字母字符(看起来你想禁止这样做),它也适用于整数(Emacs 将其用于字符)。

  2. 使用 string-match 更好——它解决了所有这些问题。正如 Trey 所示,当 case-fold-searchnil 时,您需要这样做,否则 Emacs 可能会将其视为不区分大小写的搜索。但是 string-match-p 更好,因为它避免了更改匹配数据。 (Emacs 在任何匹配后都会保留该数据,如果您使用 string-match,那么您将覆盖它,这可能会破坏使用您的函数的代码。)

  3. 另一个问题是正则表达式本身。使用 "^...$" 意味着 Emacs 将查找具有匹配内容的某行——如果您的字符串有换行符,这可能会返回虚假结果。您需要使用 backslash-unquote 和 backslash-quote,它们仅匹配字符串的开头和结尾。

所以正确的版本是:

(defun string-is-capitalized (str)
(let ((case-fold-search nil))
(string-match-p "\\`[A-Z]*\\'" str)))

(顺便说一句,Emacs Lisp 中通常的约定是使用 -p 作为谓词,如 string-capitalized-p。)

关于emacs - 在 Emacs lisp 中检查一个字符串是否全部大写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2129840/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com