【发布时间】:2022-01-20 06:56:42
【问题描述】:
假设我有以下文本:
Yes: [x]
Yes: [ x]
Yes: [x ]
Yes: [ x ]
No: [x
No: x]
我对带有两个捕获组的regex 表达式感兴趣,如下所示:
-
组
$1:匹配括号[和],其中包含x,x周围有可变数量的水平空间。我可以使用基于分支重置组的The fourth bird 的answer: -
组
$2:应该匹配包含在括号[和]中的x。为此,我可以使用非捕获组,结合肯定的后向和前瞻断言:
问题是当我尝试通过OR 加入表达式时,第二个表达式不匹配任何内容。例如:
(?|(\[)(?=\h*x\h*])|(?<=\[)\h*x\h*(]))|(?:(?<=\[)\h*(x)(?=\h*]))
结果(即,请参阅 demo 并启用extended 标志以清楚起见):
我的直觉(即,可能不正确)是没有x 可以匹配第二个表达式,因为x 在第一个表达式中匹配(即组$0)。例如,将第二个表达式简化为 (?:(x))(即,参见 demo)将很好地匹配未包含在括号中的 x,如下所示。
因此,我认为我应该以某种方式从第一个表达式中重置组 $0 匹配项。所以我尝试在(]) 之前的第一个表达式中添加\K 元转义,但这并没有解决任何问题。
另外,我想尽可能地坚持(?|regex)|(?:regex)|... 的格式,因为我希望能够与其他组进一步扩展表达式。我正在使用Oniguruma regular expressions 和PCRE 风味。您对如何实现这一点有任何想法吗?
附:如果问题的标题不完全准确,我们深表歉意。
【问题讨论】:
-
x已被\h*x\h*(])使用。 -
@WiktorStribiżew,我怀疑这可能是问题所在。是否有解决方法可以忘记
x已被使用?我还尝试将\h*x\h*也放在非捕获组中。 -
参见regex101.com/r/v6zH2m/6,将分支重置组中的第二个替代项放在“取消使用”
x的前瞻内。 -
@WiktorStribiżew,哦,这真是太聪明了!我想它可以工作,因为根据regular-expressions.info,“lookaround 实际上匹配字符,但随后放弃匹配,只返回结果”?这真是太好了!
-
您也可以在第一个备选方案中捕获组中的 x
(?|(\[)(?=\h*(x)\h*])|(?<=\[)\h*x\h*(]))请参阅 regex101.com/r/Es5na6/1
标签: regex regex-lookarounds pcre regex-group