【问题标题】:Regex atomic grouping not greedy enough正则表达式原子分组不够贪婪
【发布时间】:2012-08-31 13:50:10
【问题描述】:

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

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

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

【问题讨论】:

  • 您想要什么...无法理解您面临的问题...
  • 我想知道为什么原子分组在这种情况下不起作用,尽管我理解它应该。

标签: regex regex-greedy regex-group


【解决方案1】:

问题

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

解决方案

在末尾放一个字符串的结尾

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

【讨论】:

  • 它将匹配最后两个引号,因为第一个在原子组之前匹配。我不能把 $ 放在最后,因为大多数时候在转义字符串之后会有一些东西。感谢您解释原子组的行为(回溯开始),这很清楚。我认为非回溯组永远不会回溯。然后我将采用我的解决方案(在最后放置(?!”))
猜你喜欢
  • 2011-03-04
  • 2012-03-30
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多