我想问一下以下emacs正则表达式的含义(如果有人想知道,这是erlang-mode用于匹配单引号原子的正则表达式):
'\\(?:[^\\']\\|\\(?:\\\\.\\)\\)*'
具体而言,我无法找到三件事的解释。
首先,问号应该使前面的项目可选或指定前面的量词变得懒惰,但这里没有项目或量词,只有新组的开头那么它有什么影响呢?
第二,逃脱的撇号。为什么你需要逃避撇号?第三,四重转义\\.
,这不会让你得到一个反斜杠和一个\.
这会使它成为一个无效的正则表达式吗?
由于
答案 0 :(得分:2)
"[^\\']"
第二,逃脱撇号。为什么你需要逃避撇号?
首先请注意,在Emacs regexp语法中,\`
匹配字符串的开头,\'
匹配字符串的结尾。在多行字符串中,这与更熟悉的^
和$
不同,后者匹配行的开头和行的结尾。
但是在字符替换(方括号)中这是不相关的,所以此序列实际上匹配反斜杠或撇号以外的任何字符。
修改强>
所以从评论来看,这仍然会造成混乱,所以让我们分解一下:
"'\\(?:[^\\']\\|\\(?:\\\\.\\)\\)*'"
该代码评估为此字符串/ regexp:
'\(?:[^\']\|\(?:\\.\)\)*'
'
匹配撇号
\(?:foo\)*
匹配零个或多个foo
foo\|bar
匹配foo
或bar
[^\']
匹配除反斜杠或撇号之外的任何字符
\(?:\\.\)
可能(在这种情况下,是一个非捕获组,只发生一次)被重写为简单\\.
,并匹配反斜杠后跟除换行符之外的任何字符。
'
匹配撇号
所以整个事情匹配单引号字符串,其中:
当然,这听起来像是一种典型的字符串语法,其中反斜杠可用于转义特殊字符,包括反斜杠本身和分隔引号字符的任何实例。
答案 1 :(得分:0)
首先:(?:将多个令牌组合在一起而不创建捕获组。这允许您将量词应用于整个组。
第二和第三,我认为那些是逃脱的酒吧。每对意味着\
,而四重意味着\\
。所以,它根本不是撇号。