正则表达式的问号(在Emacs)
我想问一下下面的emacs的正则表达式的手段(如果有人想知道,这是Erlang的模式用来匹配单引号原子的正则表达式):正则表达式的问号(在Emacs)
'\\(?:[^\\']\\|\\(?:\\\\.\\)\\)*'
具体而言,我很难找到解释三件事情。
首先,应该让前面的项目可选或者指定前面的量词变懒惰的问号,但这里没有项目或量词,只有新组的开始,所以它在这里有什么作用?
二,逃脱撇号。你为什么需要逃避撇号?
三,四联转义\\.
,这不会给你一个逃脱的反斜杠和\.
这会使它成为一个无效的正则表达式吗?
感谢
"[^\\']"
二,逃脱撇号。你为什么需要逃避撇号?
首先请注意,在Emacs的正则表达式语法,\`
字符串的开头匹配,并\'
字符串的结尾匹配。在多行字符串中,这与更熟悉的^
和$
不同,后者匹配行的开头和行尾。
然而,这与字符替代(方括号)内不相关,所以这个序列实际上匹配除反斜杠或撇号以外的任何字符。
编辑:
因此,从评论,这仍是造成混乱,所以让我们把它分解:
"'\\(?:[^\\']\\|\\(?:\\\\.\\)\\)*'"
该代码的计算结果为这串/正则表达式:
'\(?:[^\']\|\(?:\\.\)\)*'
'
匹配撇号
\(?:foo\)*
匹配零个或更多foo
foo\|bar
匹配任一foo
或bar
[^\']
匹配任何字符比反斜线或撇号
\(?:\\.\)
可以(在这种情况下其他,作为一个非捕获组,只发生一次)被重写为简单的\\.
,并匹配反斜杠后跟任何除换行符之外的字符。
'
相匹配的撇号
所以整个事情相匹配的单引号字符串,其中:
- 任何其他单引号必须每一个反斜杠
- 前面任何反斜线必须是与另一个非换行符(也可以是反斜杠)配对
哪一个当然听起来像一个典型的字符串可以使用反斜杠来转义特殊字符的语法,包括反斜线本身和任何分隔引号字符的实例。
第一:(?:组多个令牌一起,而无需创建一个捕获组这允许你量词适用于全组
第二和第三,我认为这些都是逃出酒吧。每对指\
和四倍手段\\
。因此,它不是scaping撇号在所有。
我明白你对我的第一个和最后一点意味着什么,感谢您的帮助。但是在emacs中,你必须使用双重转义,例如'\\('意味着一个组的开始,这意味着\\'是一个逃脱的撇号,对吧? – tjarvstrand 2012-08-13 12:42:08
好的,所以需要转义撇号是因为它的特殊意义在字符类之外吗? – tjarvstrand 2012-08-16 08:19:16
但是为什么没有必要逃避开始和结束的撇号? – tjarvstrand 2012-08-16 09:11:57
不,重要的是你*不能*在Emacs正则表达式中有一个逃逸的撇号,一个普通的撇号匹配一个撇号。如果你在一个撇号前面加了一个反斜杠,你要么意味着除了撇号之外的其他东西,否则(在一个字符替代方案中),你只需要一个反斜杠*和*一个撇号 – phils 2012-08-16 09:14:04