Regex 如何仅使用正则表达式匹配A组字符数大于B组字符数的模式?

Regex 如何仅使用正则表达式匹配A组字符数大于B组字符数的模式?,regex,Regex,例如,我希望匹配如下模式: AAAB 阿贝布 AAB 与以下模式不匹配: 阿阿巴布 神甫 AABBB 如上示例所示,字符B的出现次数应少于字符A。请考虑在匹配后比较组长度,而不是直接在正则表达式中区分组长度 Python中的示例: 对于\u字符串集合中的测试\u字符串: match=re.match(re_myregex,test_字符串) 如果不匹配:#正则表达式根本不匹配 继续#跳到循环的顶部以尝试下一个字符串 a、 b=匹配.groups()#解包匹配组 如果len(b)>=len(a):

例如,我希望匹配如下模式:

  • AAAB
  • 阿贝布
  • AAB
  • 与以下模式不匹配:

  • 阿阿巴布
  • 神甫
  • AABBB

  • 如上示例所示,字符B的出现次数应少于字符A。

    请考虑在匹配后比较组长度,而不是直接在正则表达式中区分组长度

    Python中的示例:

    对于\u字符串集合中的测试\u字符串:
    match=re.match(re_myregex,test_字符串)
    如果不匹配:#正则表达式根本不匹配
    继续#跳到循环的顶部以尝试下一个字符串
    a、 b=匹配.groups()#解包匹配组
    如果len(b)>=len(a):#必须小于b
    持续
    #与a和b一起工作
    
    最好只使用模式长度,并像@ti7那样进行比较

    可以使用regex,但是regex没有可变长度反向引用的概念。不过,您可以先测试两个As,然后测试3个As,然后测试4个As,直到达到您需要的级别。下面是一个JavaScript示例,最多可测试4个As。作为奖励,它测试任何类型的字符序列,后跟任何其他字符序列:

    const输入=[
    “AAB”,
    “AABB”,
    “AABBB”,
    “AAAB”,
    “AAABB”,
    "AAABBB",,
    “aaabbb”,
    “AAAAB”,
    “AAAABB”,
    “AAAABBB”,
    “aaaabbb”,
    "aaaab",,
    “aaaabb”,
    “AAAAA BBB”,
    “AAAAA BBBB”,
    “aaaabbbbb”,
    ];
    常量正则表达式=/^(?:()\1(?![^\1]{2})|()\2(?![^\2]{3})|()\3\3(?![^\3]{4})|()\4\4(?![^\4]{5}));
    input.forEach(str=>{
    console.log(str+'=>'+regex.test(str));
    
    });用于PCRE兼容引擎的基于正则表达式的解决方案。(应支持子例程和lookarounds)

    该模式确实有点复杂,正如其他答案中提到的,定制代码可能是适合您场景的正确选择

    方法

    • 先匹配“A”
    • 在递归中,每个
      A
      都可以与A
      B
    演示:

    模式:

    ^(?'r'(.)
             (?>(?=\2)(?&r)(.|$)(?=\3|$)
             |)
    )$
    
    细分:

    ^(?'r'(.)
             (?>(?=\2)(?&r)(.|$)(?=\3|$)
             |)
    )$
    
    • (?'r'…)
      :定义名为
      r
      的子例程
    • ()
      :匹配任何字符。在组中捕获它
      \2
    • (?=\2)(?&r)(.|$)(?=\3 |$)
      :下一个字符与当前字符匹配。
      • (?=\2)
        :“正向前瞻”检查下一个字符是否匹配
        \2
        。(直到第一次
        B
        )为止
      • (?&r)
        :调用子例程
        r
        。(递归)
      • (.|$)(?=\3 |$)
        :这将在递归后匹配。
        • 匹配
          $
          并将其捕获到
          \3
        • 它后面应该跟有
          \3
          $
    • 或返回成功(对于第一个
      B

    因此,它不能仅用正则表达式实现?它可能有一个巧妙的反向引用(尽管您可能需要一个扩展的正则表达式库),当然这是一个有效且有趣的问题,不管是否可能!然而,您的代码可能会更难阅读,效率也会降低。这是否回答了您的问题?