0

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

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

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

4

1 回答 1

1

问题

原子分组与最后两个引号不匹配!匹配总是从左边开始。当需要回溯时(由于令牌不匹配),默认情况下会弹出最后一个令牌。但是,当使用原子组时,整个组会弹出而不是组的最后一个标记。这用于避免灾难性的回溯

解决方案

在末尾加上一个字符串的结尾:

@(?=")"(?>""|[^"])*"$
于 2012-08-31T14:13:14.890 回答