【问题标题】:Regexp question mark (in emacs)正则表达式问号(在 emacs 中)
【发布时间】:2012-08-09 16:23:14
【问题描述】:

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

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

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

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

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

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

谢谢

【问题讨论】:

    标签: regex emacs


    【解决方案1】:

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

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

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

    编辑:

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

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

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

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

    ' 匹配撇号

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

    foo\|bar 匹配 foobar

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

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

    ' 匹配撇号

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

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

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

    【讨论】:

    • 好的,所以需要转义撇号是因为它在字符类之外的特殊含义?
    • 那么为什么不需要省略起始和终止撇号呢?
    • 不,关键是您不能在 Emacs 正则表达式中使用转义撇号。一个普通的撇号匹配一个撇号。如果你在撇号前面加上反斜杠,你要么让它表示撇号以外的意思,要么(在字符替代中)你将简单地同时有一个反斜杠一个撇号。
    • 好的。抱歉,速度很慢,但我在解释原始正则表达式时仍然遇到一些问题。
    • 该死的回车键。无论如何,有了你的解释,我认为它的意思是“一个撇号后跟一个由除字符串结尾之外的任何字符或一组反斜杠和任何其他字符组成的组。这个组重复 0 次或更多次,然后用撇号。这对我来说似乎有点奇怪(不是我绝对确定这是一个很好的正则表达式)。
    【解决方案2】:

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

    第二个和第三个,我认为那些是转义吧。每对表示\,四对表示\\。所以,它根本不是转义撇号。

    【讨论】:

    • 我明白您对我的第一点和最后一点的意思,感谢您的帮助。但是,在 emacs 中,您必须使用双重转义,例如 \\( 表示组的开始。这意味着 \\' 是一个转义的撇号,对吧?
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多