正则表达式 - 最多包含1个子字符串

时间:2018-02-21 22:31:30

标签: regex

我想要一个正则表达式来查找子串bab的最多一次出现。 (在alphabeth {a,b}中)

这里我有一个正则表达式,用于在Alphabeth {a,b}

中查找bb
(a+ba)* + (a+ba)*.b + (a+ba)*.bb.(a+ab)*

我想使用这个示例正则表达式,但然后使用bab作为子字符串。 如何扩展此正则表达式以查找子串bab的最多一次出现?

我是从这个开始的:

(b+ab)* + (b+ab)*b + (a+ba)* + (a+ba)*.b + (a+ba)*.bab.(a+ab)*

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你想要匹配的字符串最多只有一个" bab"如果有多个则不匹配。

我们可以使用负向前瞻:

https://regex101.com/r/QBe2bD/3

我使用了galabra发布的测试字符串作为起点。

注意:" babab"火柴。如果你不想匹配它,你可以使用替代,但我把它留作练习。

提示:^(?!.*bab(.*bab|--)).*$ 替换" - "有两个字符,可以让你不匹配babab。

答案 1 :(得分:0)

首先,我不得不说这比我想象的复杂得多,花了一些时间来解决。当然是一个很好的问题!

下图(使用draw.io制作)说明了下面的正则表达式:

States diagram for the regular expressions

  

蓝色圆圈表示可能的起点,红色圆圈表示字符串可以终止的位置。

关于正则表达式:

  1. The following regex完全按照其编写的方式体现了图表:

    ^a*(b+(aa+)*)*bab((a(a+(b+)*)*)*|b+(aa*)*)$
    
  2. 其中this regex相同,但简化且排序良好:

    ^a*(?:b+(?:a{2,})*)*bab(?:(?:a(?:a+b*)*)*|b+a*)$