如何在开始时匹配可选字符串?

时间:2019-03-31 02:42:09

标签: regex pcre

我正在寻找一个正则表达式,可以简化不使用OR正则表达式的情况-|,因为我只想要一个捕获组。

规则应匹配行x开头的任何内容,并在其后有一个空格,然后在()中使用一个大写字母。

或者匹配行首()中大写字母的任何内容。

^\(([A-Z])\)|^x \(([A-Z])\) # works with |

应该匹配

x (A) should match A
(B) should match B

不匹配

should not match (Z)
x should (A) not match

1 个答案:

答案 0 :(得分:1)

只需将x和空格字符放在一个非捕获组中,并使用? quantifier将其设置为可选:

^(?:x )?\(([A-Z])\)

Here's a demo

或者,您仍然可以使用|运算符,但如果使用正数Lookbehind,则只有一个捕获组:

(?<=^x |^)\(([A-Z])\)

Demo

您甚至可以更进一步,完全摆脱捕获组的束缚,如果愿意,可以将大写字母作为整个比赛的内容

(?<=^x \(|^\()[A-Z](?=\))

Demo

但是那太过分了。我会选择第一个解决方案。