如何捕获A组或B组,但不是两者兼而有之?

时间:2018-03-01 09:34:23

标签: regex

我想制作一个正则表达式来捕获格式test1 anything hereanything here test2的字符串,但 test1 anything here test2

有没有办法为此编写正则表达式?基本上,我想要像/^(test1 )?(.*)$( test2)?/i这样的东西,但是阻止test1和test2出现。另外,我的例子是错误的,因为它永远不会超过第二个捕获组......我怎么能这样做?

编辑:我希望能够捕获anything here部分,因此它需要位于自己的捕获组内。

1 个答案:

答案 0 :(得分:1)

你可以使用负向前瞻和后瞻的替代方法:

(test1 (((?!test2).)*)$)|(^(((?<!test1).)*)test2)

Demo

阐释:

  • (test1 ((?!test2).)*$)找到包含test1且没有test2的行:
    • test1匹配文字test1
    • (?!test2)否定前瞻 - 匹配地点,除非提前test2
    • ((?!test2).)*是一个驯化的贪婪令牌(尽可能匹配test2文字)
    • $行尾断言以确保没有拖尾test2

备选方案的第二部分是类似的,但我们检查没有使用负面后顾问test1

的前导(?<!...)

值得一读:https://stackoverflow.com/a/37343088/580346