1

我想问一下下面的emacs正则表达式是什么意思(如果有人想知道,这是erlang-mode用于匹配单引号原子的正则表达式):

'\\(?:[^\\']\\|\\(?:\\\\.\\)\\)*'

具体来说,我很难找到三件事的解释。

首先,问号应该要么使前面的项目可选或指定前面的量词使懒惰,但这里没有项目或量词,只有一个新组的开始,那么它在这里有什么作用?

第二,转义的撇号。为什么需要避开撇号?

第三,四重转义\\.,这不会给您留下一个转义的反斜杠和一个\.会使它成为无效正则表达式的 a 吗?

谢谢

4

2 回答 2

2

"[^\\']"
第二,转义的撇号。为什么需要避开撇号?

首先请注意,在 Emacs 正则表达式语法中,\`匹配字符串的开头,并\'匹配字符串的结尾。在多行字符串中,这与更熟悉的^and不同$,后者匹配行首和行尾。

但是,这与替代字符(方括号)无关,因此该序列实际上匹配反斜杠或撇号以外的任何字符。

编辑:

所以从评论来看,这仍然会引起混乱,所以让我们分解一下:

"'\\(?:[^\\']\\|\\(?:\\\\.\\)\\)*'"

该代码计算为此字符串/正则表达式:

'\(?:[^\']\|\(?:\\.\)\)*'

'匹配撇号

\(?:foo\)*匹配零个或多个foo

foo\|bar匹配foobar

[^\']匹配除反斜杠或撇号以外的任何字符

\(?:\\.\)可以(在这种情况下,是一个只出现一次的非捕获组)被重写为 simple \\.,并匹配反斜杠后跟除换行符以外的任何字符。

'匹配撇号

所以整个事情匹配一个单引号字符串,其中:

  • 任何其他单引号都必须以反斜杠开头
  • 任何反斜杠必须与另一个非换行符配对(也可以是反斜杠)

当然,这听起来像是一种典型的字符串语法,其中反斜杠可用于转义特殊字符,包括反斜杠本身和分隔引号字符的任何实例。

于 2012-08-15T05:35:07.917 回答
0

首先: (?: 将多个标记组合在一起而不创建捕获组。这允许您将量词应用于整个组。

第二和第三,我认为那些是逃脱的酒吧。每对意味着\,四对意味着\\。所以,它根本没有转义撇号。

于 2012-08-13T12:37:33.703 回答