更多字符串匹配功能

时间:2010-01-24 19:59:44

标签: regex string-matching

是否可以创建一个匹配所有五个a和五个b的字符串的正则表达式?

像aaaaabbbbb或ababababab或aabbaabbab。

我认为确定性引擎需要多项式时间。

是否有其他匹配的语言可以实现这种匹配?

更新

我想使用这种表达式进行搜索,所以我将目的改为(?=b*ab*){5}(?=a*ba*){5}([ab]{10})并且效果很好! :) 我仍然不确定这样表达的表现。但我想我可以只查看前瞻性表达。

我仍然很好奇哪些其他类型的模式很容易解释但很难正则表达式?

2 个答案:

答案 0 :(得分:6)

  

我有这些螺丝。要把它们钉在这块木头上,我应该用爪子还是圆头锤?

那是(大致)你的问题所要求的。你应该做的只是循环遍历字符串的每个字符。我可以用C.观察:

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;
}

你可以将它转换为你选择的语言,b)修改它以匹配'a'和'b'的连续序列(如果你愿意)或者根据你的其他特定要求进行调整。

基本的一点是,这个工作有比正则表达式更好的工具,所以除非“a”和“b”代表更复杂的正则表达式,否则不要使用正则表达式。即使“a”和“b”真的是更复杂的正则表达式,你也不必用One Regex来解决所有问题。您可以将一些有用的正则表达式和一个代码循环(如上所述)混合使用,而不是一个巨大的(并且不可维护的)Regex-zilla。

答案 1 :(得分:5)

您可以使用lookahead assertions

^(?=(?:[^a]*a){5}[^a]*$)(?=(?:[^b]*b){5}[^b]*$)