正则表达式:匹配“要么A要么B”但不包括“既不A也不B”

5

这里使用的是Notepad++ v7.9。

假设R是一个复杂的正则表达式模式,现在我想匹配 _RR_ 或者 _R_,但不想匹配单独的R。如何做到这一点,而不必显式地编写(_R|R_|_R_)?这需要将R写三次,看起来很丑陋。

我能想到的最接近的方法是_?R_?,但它也匹配单独的R(实际上等同于它),这对我来说是误报。

介于两者之间的是(_?R_|_R_?),但这里再次重复了R,虽然减少了一次。


Notepad++ v7.9。 - Charles
也许这个可以帮到你:(?!^R$)_?R_? - Alireza
我对你目前的替代方法没有问题。 - Tim Biegeleisen
我不认为这是可能的,但你可能会发现 _?(R)_?\1?_ 很有趣。https://regex101.com/r/KKNrJa/1 - MonkeyZeus
1个回答

11

您可以按照以下方式使用If-Then-Else

(_)?R(?(1)_?|_)

演示.

这使您只需编写一次R

详细说明:

(_)?        # An optional capturing group that matches an underscore character.
R           # Matches 'R' literally (replace it with your pattern).
(?          # If...
    (1)     # ..the first capturing group is found,...
    _?      # ..then match zero or one underscore characters (optional).
|           # Else (otherwise)...
    _       # Match exactly one underscore character (required).
)           # End If.

适用于Notepad++:

Notepad++演示


2
哇,我喜欢这个!你向我介绍了正则表达式中的if/else... - MonkeyZeus
不知道if-Then-Else是什么,请解释一下吗? - Charles
@Charles 请查看 https://www.regular-expressions.info/conditional.html。 - Wiktor Stribiżew
@Charles 添加了一个解释。有关条件正则表达式的更多信息,请参考我的答案中的第一个链接。 - 41686d6564 stands w. Palestine
1
@Charles 不,if 部分会在第一组为 None 时触发,这就是为什么 ? 在第一捕获组之外的原因。 - Wiktor Stribiżew
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接