0

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

就像 aaaaabbbbb 或 ababababab 或 aabbaabbab。

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

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

更新

我想用那种表达方式进行搜索,所以我把目的换成了(?=b*ab*){5}(?=a*ba*){5}([ab]{10}),效果很好!:) 对于这样的表达方式,我仍然不确定。但我想我只能查找前瞻表达式。

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

4

2 回答 2

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

它留给您作为练习 a) 将其转换为您选择的语言,b) 修改它以仅匹配 'a's 和 'b's 的连续序列(如果您愿意)或根据您的其他特定要求对其进行调整。

基本的一点是这个工作有比正则表达式更好的工具,所以除非“a”和“b”是更复杂的正则表达式的替代品,否则不要为此使用正则表达式。即使“a”和“b”确实是更复杂的正则表达式,您也不必使用一个正则表达式来解决所有问题来统治它们。您可以混合一些有用的正则表达式和一个代码循环(如上面的),以产生比巨大(且不可维护)的 Regex-zilla 更大的效果。

于 2010-01-24T20:17:24.457 回答
4

您可以使用前瞻断言

^(?=(?:[^a]*a){5}[^a]*$)(?=(?:[^b]*b){5}[^b]*$)
于 2010-01-24T20:01:28.443 回答