正则表达式原子分组不够贪婪

时间:2012-08-31 13:50:10

标签: regex regex-greedy regex-group

我正在尝试构建一个匹配@"hello""world"等转义字符串的正则表达式。到目前为止,我有(忽略空格):

@(?=")"   #at sign if followed by double quote then double quote          
(?>       #atomic
    ""              
  |
    [^"]                             
)*
"

问题是无效(因为它未关闭)字符串@"""@""匹配。我认为当我使用原子分组又称非回溯子表达式时,(?>""|[^"])*将匹配@"""的最后两个双引号(因为左侧替代可以匹配两个双引号),然后导致整体匹配失败期望(因为正则表达式的最后"不存在)但该组似乎不够贪婪(虽然有贪婪的量词*和原子分组)并且仍然回溯到了一旦发现正则表达式失败,就会出现正则表达式的第一个"。解决方法是将(?!")置于正则表达式的末尾,但我想知道为什么它不适用于原子分组。

1 个答案:

答案 0 :(得分:1)

问题

Atomic grouping不匹配最后两个引号!匹配始终从左侧开始。当需要回溯时(由于不匹配的令牌),默认情况下会弹出最后一个令牌。但是,当使用原子组时,整个组弹出而不是只有该组的最后一个标记。这用于避免catastrophic backtrackings

解决方案

在结尾放置一个字符串

@(?=")"(?>""|[^"])*"$