怎么样?在正则表达式中使量词变得懒惰

Uri*_*atz 3 regex operators quantifiers

我一直在寻找到最近的正则表达式,并盘算了一下,?运营商使*,+?懒惰.我的问题是它是如何做到的?*?例如它是一个特殊的运算符,还是?对它有影响*?换句话说,没有正则表达式识别*?为一个运营商本身,还是正则表达式识别*?为两个独立的运营商*??如果*?是被识别为两个独立运算符的情况,那么?影响*它如何变得懒惰.如果?意味着它*是可选的,那么这*不应该意味着它根本不存在.如果是,那么在声明中.*?不会正则表达式匹配单独的字母和整个字符串而不是较短的字符串?请解释一下,我迫切希望了解.非常感谢.

Tim*_*ker 13

? 在不同的环境中可能意味着很多不同的东西.

  • 遵循正常的正则表达式令牌(字符,速记,字符类,组......),它表示"匹配前一项0-1次".
  • 继量词一样?,*,+,{n,m},它呈现出不同的含义:"让以前的量词懒惰,而不是贪婪(如果这是默认的,这是可以改变的,虽然-例如在PHP中,/U修改使所有量词懒默认,所以额外?让他们贪心).
  • 在左括号之后,它标记了一个特殊构造的开始,例如

    a)(?s):模式修饰符("打开dotall模式")
    b)(?:...):使组非捕获
    c)(?=...)(?!...):先行断言
    d)(?<=...)(?<!...):lookbehind断言
    e)(?>...):原子组
    f)(?<foo>...):命名捕获组
    g)(?#comment):内联注释,被正则表达式引擎
    h)忽略(?(?=if)then|else):条件

和别的.并非所有正则表达式都具有所有构造.

  • 在字符类([?])中,它只是简单地匹配逐字?.

  • 啊,是的,`??` 是一个非贪婪的 `?`! (2认同)

Ala*_*ore 5

我认为稍微了解一下历史会更容易理解。当 Larry Wall 想要增加正则表达式语法以支持新功能时,他的选择受到严重限制。他不能仅仅规定(例如)%现在是支持新功能“XYZ”的元字符。这将打破数百万个碰巧%用来匹配文字百分号的现有正则表达式。

可以做的是采用一个已经定义的元字符并以这样一种方式使用它,使其原始功能没有意义。例如,任何连续包含两个量词的正则表达式都是无效的,因此可以安全地说一个?又一个量词现在将其变成一个不情愿的量词(一个比“懒惰”IMO 更好的名字;非贪婪也很好) . 所以回答你的问题是,?修改**?是一个单一的实体:一个不情愿的量词。同样是真实的+在所有格量词(*+{0,2}+等)。

组语法也发生了类似的过程。在未转义的左括号之后使用量词永远没有意义,因此可以肯定地说(?现在标志着特殊组结构的开始。但是,问号仅此一项就只能支持一个新功能,所以?本身应遵循已应遵循由至少一个以上的字符表示何种组是((?:...)(?<!...),等)。同样,(?:是单个实体:非捕获组的开始定界符。

我不知道他为什么两次都用问号。我确实知道Perl 6 规则(Perl 5 正则表达式的自下而上重写)已经消除了所有这些废话,并使用了无限更合理的语法。