2

在 emacs lisp 中,我只知道函数string-match[-p],但我不知道将文字字符串与字符串匹配的方法。

例如,假设我有一个由某个函数生成的字符串,并且想知道另一个字符串是否包含它。在许多情况下可以正常工作,但是当生成的字符串包含正则表达式语法时,它会导致意外行为,如果包含的正则表达式语法无效(例如不平衡的带引号的括号, ) string-match-p,甚至可能崩溃。\(\)

  1. emacs lisp 中的 some 函数是否类似于string-match-p但不解释正则表达式语法?
  2. 由于在 CI 中实现了正则表达式匹配,因此假设匹配正确的正则表达式比 some substring/string=循环更快;是否有某种方法可以将任意字符串转义为匹配该字符串且仅匹配该字符串的正则表达式?
4

3 回答 3

8

你在找regexp-quote吗?

文档说:

(regexp-quote STRING)

Return a regexp string which matches exactly STRING and nothing else.

而且我不知道您在#2中的假设是否正确,string=应该更快...

于 2013-06-18T17:37:14.780 回答
4

要么regexp-quote按照@trey-jackson 的建议使用,要么根本不使用字符串。

Emacs 没有针对字符串处理进行优化;它针对缓冲区进行了优化。因此,如果您操作文本,您可能会发现创建一个临时缓冲区会更快,在其中插入您的文本,然后用于search-forward在该缓冲区中查找您的固定字符串(非正则表达式)。

于 2013-06-18T22:33:33.050 回答
0

也许cl-mismatch,类似于 Common Lispmismatch函数?下面的示例用法:

(mismatch "abcd" "abcde")
;; 4
(mismatch "abcd" "aabcd" :from-end t)
;; -1
(mismatch "abcd" "aabcd" :start2 1)
;; nil

啊,对不起,我第一次没看懂这个问题。如果您想知道字符串是否是另一个字符串的子字符串(可能从搜索字符串中的任何索引开始),那么您可以cl-search再次使用 Common Lispsearch函数的类似物。

(search "foo\\(bar" "---foo\\(bar")
;; 3
于 2013-06-18T19:43:02.903 回答