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

Regex 正则表达式原子分组不够贪婪,regex,regex-greedy,regex-group,Regex,Regex Greedy,Regex Group,我正在尝试构建一个正则表达式,它匹配转义字符串,如@“hello”“world”。到目前为止,我有(忽略空白): 问题是无效(因为它不是闭合的)字符串@“匹配为@”。我认为,当我使用原子分组(也称为非回溯子表达式)时,(?>“|[^]”])*将匹配@“的最后两个双引号(因为左边的选项可以匹配两个双引号)然后导致整体匹配失败(因为正则表达式的最后一个“不存在),但该组看起来不够贪婪(尽管有贪婪的量词*和原子分组),仍然返回到第一个之后的点一旦发现正则表达式出现故障,。一种解决方法是将(?!”)放在

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

问题是无效(因为它不是闭合的)字符串
@“
匹配为
@”
。我认为,当我使用原子分组(也称为非回溯子表达式)时,
(?>“|[^]”])*
将匹配
@“
的最后两个双引号(因为左边的选项可以匹配两个双引号)然后导致整体匹配失败(因为正则表达式的最后一个
不存在),但该组看起来不够贪婪(尽管有贪婪的量词
*
和原子分组),仍然返回到第一个
之后的点一旦发现正则表达式出现故障,
。一种解决方法是将
(?!”)
放在正则表达式的末尾,但我想知道为什么它不适用于原子分组。

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

解决方案 将字符串的结尾放在末尾:

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

你想要什么…无法理解你面临的问题…我想知道为什么原子分组在这种情况下不起作用,尽管我理解它应该如此。它会匹配最后两个引号,因为第一个引号在原子组之前匹配。我不能将$放在末尾,因为大多数情况下,转义字符串后面会出现一些内容。比谢谢你解释原子群的行为(开始时回溯),这说明了这一点。我认为非回溯群永远不会回溯。然后我将使用我的解决方案(在末尾放置(?!)
@(?=")"(?>""|[^"])*"$