2013-06-18 271 views
2

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

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

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

回答

6

您是在查找regexp-quote

文档说:

(regexp-quote STRING) 

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

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

+2

谢谢,这在大多数情况下都有帮助。此外,对于一个68字符的查询字符串和一个≈300字符串来在字符串中进行搜索 - 使用'regexp-quote'的实现在编译代码中执行速度快40倍,未编译代码执行速度快60倍。对于“string-starts-with”,“string-ends-with”,然而,一个天真的'(string =(substring ...)...)'实现在编译代码中快了4倍(未编译代码慢了4倍)为相似的输入大小。 – kdb

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 
4

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

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

+2

在我的系统上,'with-temp-buffer'的开销大约是2e-6秒(0.2秒用于执行'(with-current-buffer(+ 1 1))'10,000次。虽然可以忽略不计,但对于短字符串(≈10-30个字符)而言,开销比字符串函数(内建的,我试过的和我自己编写的)的时间要大100-1000倍。我会相信你,但是,对于长字符串缓冲提供更好的性能,所以谢谢你的答案! – kdb