emacs中匹配任意字符串的字符串匹配

时间:2013-06-18 17:25:25

标签: regex emacs escaping elisp string-matching

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

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

  1. emacs lisp中的某些功能是否与string-match-p类似,但不解释正则表达式语法?
  2. 由于在C中实现了正则表达式匹配,我假设匹配正确的正则表达式比某些substring / string=循环更快;是否有一些方法可以将任意字符串转换为匹配该字符串且只匹配该字符串的正则表达式?

3 个答案:

答案 0 :(得分:6)

您在寻找regexp-quote吗?

文档说:

(regexp-quote STRING)

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

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

答案 1 :(得分:4)

根据@ trey-jackson的推荐使用regexp-quote,或者根本不使用字符串。

Emacs未针对字符串处理进行优化;它针对缓冲区进行了优化。因此,如果您操作文本,您可能会发现它更快create a temporary buffer,在那里插入文本,然后使用search-forward在该缓冲区中找到固定字符串(非正则表达式)。

答案 2 :(得分:0)

也许是cl-mismatch,与Common Lisp mismatch函数类似?以下示例用法:

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

啊,对不起,我第一次不明白这个问题。如果你想知道字符串是否是另一个字符串的子字符串(可以从搜索字符串中的任何索引开始),那么你可以再次使用cl-search和Common Lisp search函数的类比。

(search "foo\\(bar" "---foo\\(bar")
;; 3