我正在尝试构建一个匹配@"hello""world"
等转义字符串的正则表达式。到目前为止,我有(忽略空格):
@(?=")" #at sign if followed by double quote then double quote
(?> #atomic
""
|
[^"]
)*
"
问题是无效(因为它未关闭)字符串@"""
与@""
匹配。我认为当我使用原子分组又称非回溯子表达式时,(?>""|[^"])*
将匹配@"""
的最后两个双引号(因为左侧替代可以匹配两个双引号),然后导致整体匹配失败期望(因为正则表达式的最后"
不存在)但该组似乎不够贪婪(虽然有贪婪的量词*
和原子分组)并且仍然回溯到了一旦发现正则表达式失败,就会出现正则表达式的第一个"
。解决方法是将(?!")
置于正则表达式的末尾,但我想知道为什么它不适用于原子分组。
答案 0 :(得分:1)
Atomic grouping不匹配最后两个引号!匹配始终从左侧开始。当需要回溯时(由于不匹配的令牌),默认情况下会弹出最后一个令牌。但是,当使用原子组时,整个组弹出而不是只有该组的最后一个标记。这用于避免catastrophic backtrackings。
在结尾放置一个字符串:
@(?=")"(?>""|[^"])*"$