Elisp正则表达式^和$ vs`和'


16

本手册介绍了regexp特殊字符^$。就像我所知道的大多数正则表达式方言一样,它们似乎与字符串的开头或结尾匹配。但是,我也发现有`'字符可用。根据此处的说明,它们似乎也匹配字符串的开头或结尾。有人可以解释这些特殊字符之间的区别,并举例说明何时使用它们吗?

当我查看的值时auto-mode-alist,它们似乎可以互换使用以匹配字符串的结尾:

(...
 ("\\.scss\\'" . scss-mode)
 ("\\.ya?ml$" . yaml-mode)
...)

2
当人们那样使用时$,他们依靠的是不包含换行符的文件名。这通常是(非常)安全的假设,但不能保证\\'因此,使用是最佳实践。
2015年

Answers:


14

您的字符串可能具有嵌入的换行符,在这种情况下,它\'与字符串的末尾匹配,但$恰好在换行符char之前。

引用Elisp手册,节点Regexp Special

当匹配字符串而不是缓冲区时,$匹配在字符串的末尾或换行符之前。

同样,\`匹配字符串的开头,但^匹配换行符char之后。再次,手册:

当匹配字符串而不是缓冲区时,“ ^”匹配字符串的开头或换行符之后。

因此,对于字符串,通常要使用\`\',尤其是如果您的代码无法提前知道字符串中是否可能包含换行符。对于缓冲区中的文本,通常使用^$


6
(string-match "^foo" "foo")         ; => 0
(string-match "\\`foo" "foo")       ; => 0
(string-match "^foo" "bar\nfoo")    ; => 4
(string-match "\\`foo" "bar\nfoo")  ; => nil

(string-match "foo$" "foo")         ; => 0
(string-match "foo\\'" "foo")       ; => 0
(string-match "foo$" "foo\nbar")    ; => 0
(string-match "foo\\'" "foo\nbar")  ; => nil

^$匹配的开始和结束

\`\'匹配整个字符串的开始和结束。


2
there are ` and ' characters available. [...] they seem to also match the start or end of strings

特殊字符为:. * + ? ^ $ \ [

括号之间 [],以下内容也很特殊:] - ^

当使用反斜杠时,包括反引号`和单引号'在内的许多字符会变得特殊。看这里更多详细信息,。

Could someone please explain the difference between these special characters, with an example and recommendation on when to use them?

两者之间有区别 beginning of stringbeginning of each line in the string

由Ergoemacs提供。你可以在这里阅读更多

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.