Uri*_*atz 3 regex operators quantifiers
我一直在寻找到最近的正则表达式,并盘算了一下,?运营商使*,+或?懒惰.我的问题是它是如何做到的?*?例如它是一个特殊的运算符,还是?对它有影响*?换句话说,没有正则表达式识别*?为一个运营商本身,还是正则表达式识别*?为两个独立的运营商*和??如果*?是被识别为两个独立运算符的情况,那么?影响*它如何变得懒惰.如果?意味着它*是可选的,那么这*不应该意味着它根本不存在.如果是,那么在声明中.*?不会正则表达式匹配单独的字母和整个字符串而不是较短的字符串?请解释一下,我迫切希望了解.非常感谢.
Tim*_*ker 13
? 在不同的环境中可能意味着很多不同的东西.
?,*,+,{n,m},它呈现出不同的含义:"让以前的量词懒惰,而不是贪婪(如果这是默认的,这是可以改变的,虽然-例如在PHP中,/U修改使所有量词懒默认,所以额外?让他们贪心).在左括号之后,它标记了一个特殊构造的开始,例如
a)(?s):模式修饰符("打开dotall模式")
b)(?:...):使组非捕获
c)(?=...)或(?!...):先行断言
d)(?<=...)或(?<!...):lookbehind断言
e)(?>...):原子组
f)(?<foo>...):命名捕获组
g)(?#comment):内联注释,被正则表达式引擎
h)忽略(?(?=if)then|else):条件
和别的.并非所有正则表达式都具有所有构造.
[?])中,它只是简单地匹配逐字?.我认为稍微了解一下历史会更容易理解。当 Larry Wall 想要增加正则表达式语法以支持新功能时,他的选择受到严重限制。他不能仅仅规定(例如)%现在是支持新功能“XYZ”的元字符。这将打破数百万个碰巧%用来匹配文字百分号的现有正则表达式。
他可以做的是采用一个已经定义的元字符并以这样一种方式使用它,使其原始功能没有意义。例如,任何连续包含两个量词的正则表达式都是无效的,因此可以安全地说一个?又一个量词现在将其变成一个不情愿的量词(一个比“懒惰”IMO 更好的名字;非贪婪也很好) . 所以回答你的问题是,?不修改的*, *?是一个单一的实体:一个不情愿的量词。同样是真实的+在所有格量词(*+,{0,2}+等)。
组语法也发生了类似的过程。在未转义的左括号之后使用量词永远没有意义,因此可以肯定地说(?现在标志着特殊组结构的开始。但是,问号仅此一项就只能支持一个新功能,所以?本身应遵循已应遵循由至少一个以上的字符表示何种组是((?:...),(?<!...),等)。同样,(?:是单个实体:非捕获组的开始定界符。
我不知道他为什么两次都用问号。我确实知道Perl 6 规则(Perl 5 正则表达式的自下而上重写)已经消除了所有这些废话,并使用了无限更合理的语法。