基于条件的正则表达式需要匹配特定内容

时间:2018-04-11 13:14:31

标签: regex regex-lookarounds

实施例。 string1 string2 content abc

我想从上面的内容中选择content abc,我已经使用了

  

(?< = string1(string2))。*

但有时string2不会出现在整个内容中。我用过这个

  

(小于?=字符串1)。*

内容可能是随机出现的,如果string2来了,我还需要一个正则表达式才能进行内容播放。 我试过这个不工作

  

(?< = string1(string2))。* |(?< = string1)。*

2 个答案:

答案 0 :(得分:1)

使用Java变量lookbehinds你可以做到这一点,你不应该尝试不支持Java的在线正则表达式测试器:

(?<=\bstring2\b|\bstring1\b(?!.{0,999999}\bstring2\b)).*

单词的顺序很重要。这匹配以下字符串:

string1 string2 abc
               ^^^^
string1 abc
       ^^^^
string2 abc
       ^^^^

注意如果您不想与后者匹配,可以使用@Wiktor's answer

故障:

  • (?<=开始积极的观察
    • \bstring2\b匹配单词string2
    • |
    • \bstring1\b匹配单词string1
    • (?!.{0,999999}\bstring2\b)这不在单词string2
    • 之前
  • ) PL结束
  • .*匹配到行尾

答案 1 :(得分:1)

您的(?<=string1( string2)).*|(?<=string1).*无法正确匹配string1 string2 content abc字符串,因为引擎在从左到右分析字符串时会将string1后的位置与第二个替代字符匹配({{1 }})。

您可能使用的正则表达式是

(?<=string1).*

请参阅regex demo

<强>详情

  • (?<=string1(?! string2)|string1 string2).* - 是一个积极的外观,需要(?<=string1(?! string2)|string1 string2)没有后跟空格string1string2
  • string1 string2 - 匹配除了换行符之外的0 +字符。

如果您计划匹配整个单词,请使用.*单词边界围绕\b(请记住在Java字符串文字中加倍反斜杠)。