代码之家  ›  专栏  ›  技术社区  ›  Thomas Ahle

更多字符串匹配功能

  •  0
  • Thomas Ahle  · 技术社区  · 16 年前

    是否可以创建一个regex,使所有字符串都与5个a和5个b匹配?

    像aaaa bbbbb或ababababab或aabbaabbab。

    我认为对于确定性引擎来说,它需要多项式时间。

    是否有其他匹配语言可以启用这种匹配?

    更新 :

    我想用这种表达方式来寻找,所以我把它改为 (?=b*ab*){5}(?=a*ba*){5}([ab]{10}) 而且效果很好!:) 对于这样一个表达的表现,我仍然不确定。但我想我可以看看前瞻性的表达。

    我仍然很好奇还有哪些其他类型的模式,这些模式解释起来很简单,但是很难重新生成?

    2 回复  |  直到 16 年前
        1
  •  5
  •   Gumbo    16 年前

    你可以使用 lookahead assertions :

    ^(?=(?:[^a]*a){5}[^a]*$)(?=(?:[^b]*b){5}[^b]*$)
    
        2
  •  6
  •   Chris Lutz    16 年前

    我有这些螺丝钉。要把它们锤成这片木头,我应该用羊角锤还是球锤?

    这就是你的问题。你什么 应该 do只是循环遍历字符串的每个字符。我可以在C.Watch中完成:

    int validate(char *s)
    {
        int a = 0, a = 0;
        while(*s)
          {
            switch(*s++)
            {
            case 'a':
                a++;
                break;
            case 'b':
                b++;
                break;
            }
          }
        return a == 5 && b == 5;
    }
    

    把它作为练习留给你:a)把它转换成你选择的语言;b)修改它,只匹配“a”和“b”的连续序列(如果你喜欢的话),或者把它调整到你的其他特定要求。

    最基本的一点是,此作业有比regex更好的工具,所以除非“a”和“b”代表更复杂的正则表达式,否则不要为此使用regex。即使“a”和“b”真的是更复杂的正则表达式,也不必用一个正则表达式来解决所有的问题,从而将它们统统统治。您可以混合一些有用的regex和一个代码循环(如上图所示),其效果比一个巨大的(且不可维护的)regex-zilla大得多。