【问题标题】:Regular expression - Contain at most 1 occurrence of substring正则表达式 - 最多包含 1 次出现的子字符串
【发布时间】:2018-08-01 16:01:27
【问题描述】:

我想要一个正则表达式来查找最多一次出现的子字符串 bab。 (在字母 {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)*

【问题讨论】:

  • 您的正则表达式语法不正确。也许你已经把它和逻辑语法混在一起了?
  • 我不确定我是否理解您要执行的操作。你能澄清你的问题、意图和期望吗?
  • 如果我理解您的问题,如果您希望正则表达式在第一次匹配后返回,请不要使用全局过滤器。见:regex101.com/r/bZG3lN/1
  • 对描述进行了编辑。 @Khanna111 不接受例如 a 或 b 或 aa 等。最多可以有子串bab。所以,aaababaaabab 不被接受
  • @MeesvanZ 请。检查答案。

标签: regex


【解决方案1】:

如果我理解您的问题,您希望匹配最多只有一个“bab”计数的字符串,如果有多个则不匹配。

我们可以为此使用负前瞻:

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

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

注意:“babab”匹配。如果您不想匹配,您可以使用替代方法,但我将其留作练习。

提示:^(?!.*bab(.*bab|--)).*$ 将“--”替换为两个不匹配 babab 的字符。

【讨论】:

    【解决方案2】:

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

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

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

    至于正则表达式:

    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*)$
      

    【讨论】:

    • 你有没有使用任何工具来制作图表?
    • 我没有让这个正则表达式工作......例如在这个工具中:ivanzuzak.info/noam/webapps/fsm2regex
    • @MeesvanZ 你想通过这个平台实现什么目标?
    猜你喜欢
    • 2011-07-22
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 2018-06-18
    相关资源
    最近更新 更多