【问题标题】:Condition based regex needed to match a particular content匹配特定内容所需的基于条件的正则表达式
【发布时间】:2026-01-17 08:00:02
【问题描述】:

例如。 string1 string2 content abc

我想从上面的内容中选择content abc,我用过

(?

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

(?

内容可能随机出现,如果 string2 出现或不出现,我需要一个正则表达式来推进内容。 我试过这个不起作用

(?

【问题讨论】:

标签: regex regex-lookarounds


【解决方案1】:

您的(?<=string1( string2)).*|(?<=string1).* 未能正确匹配string1 string2 content abc 字符串,因为引擎在从左到右分析字符串时,将string1 之后的位置与第二个备选方案((?<=string1).*) 匹配。

你可以使用的正则表达式是

(?<=string1(?! string2)|string1 string2).*

请参阅regex demo

详情

  • (?&lt;=string1(?! string2)|string1 string2) - 是一个正向的后视,需要 string1 的存在,后面没有空格和 string2string1 string2
  • .* - 匹配除换行符以外的 0+ 个字符。

使用\b 围绕stringX 的单词边界,以防您打算匹配整个单词(记住在Java 字符串文字中使用双反斜杠)。

【讨论】:

    【解决方案2】:

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

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

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

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

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

    细分:

    • (?&lt;= 开始积极的回顾
      • \bstring2\b匹配词string2
      • |或者
      • \bstring1\b匹配词string1
      • (?!.{0,999999}\bstring2\b) 那不在字前面string2
    • ) PL 结束
    • .*匹配到行尾

    【讨论】:

    • 你可以使用RegexPlanet来展示模式。
    • 我知道支持 Java 的在线正则表达式测试器。我只是不喜欢他们。
    最近更新 更多