正则表达式问号(在emacs中)

时间:2012-08-13 12:30:21

标签: regex emacs

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

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

具体而言,我无法找到三件事的解释。

首先,问号应该使前面的项目可选或指定前面的量词变得懒惰,但这里没有项目或量词,只有新组的开头那么它有什么影响呢?

第二,逃脱的撇号。为什么你需要逃避撇号?

第三,四重转义\\.,这不会让你得到一个反斜杠和一个\.这会使它成为一个无效的正则表达式吗?

由于

2 个答案:

答案 0 :(得分:2)

  

"[^\\']"
  第二,逃脱撇号。为什么你需要逃避撇号?

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

但是在字符替换(方括号)中这是不相关的,所以此序列实际上匹配反斜杠或撇号以外的任何字符。

修改

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

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

该代码评估为此字符串/ regexp:

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

'匹配撇号

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

foo\|bar匹配foobar

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

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

'匹配撇号

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

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

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

答案 1 :(得分:0)

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

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