【问题标题】:More string matching features更多字符串匹配功能
【发布时间】:2011-01-08 20:53:12
【问题描述】:

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

比如 aaaaabbbbb 或 ababababab 或 aabbaabbab。

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

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

更新

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

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

【问题讨论】:

  • 我可以编写一个使用单个 for 循环的简单 O(n) 函数;)
  • 您真的是出于好奇而问吗?这不是您想使用正则表达式解决的问题。

标签: regex string-matching


【解决方案1】:

你可以使用lookahead assertions:

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

【讨论】:

  • 您可能希望在前瞻之后添加.{10}$。规格尚不清楚,但从示例看来,字符串应该正好包含 5 个 a 和 5 个 b,仅此而已。
  • @Tim Pietzcker:在这种情况下,我宁愿将[^a] 替换为b,将[^b] 替换为a
  • 其实我用(?=(?:[^a]*a){5}[^a]*)(?=(?:[^b]*b){5}[^b]*)(.{10})搜索字符串aababababab,发现错误的部分:aababababa。除非您可以对前瞻设置字符限制,否则我看不到解决此问题的方法?
  • @Thomas Ahle:所以您宁愿找到包含五个as 和五个bs 的序列?
  • 好吧,查找、匹配和子。就像您通常使用正则表达式一样。但大多都能找到。
【解决方案2】:

我有所有这些螺丝。要将它们锤入这块木头,我应该使用爪锤还是球头锤?

这(大致)是您的问题。你应该做的只是遍历字符串的每个字符。我可以在 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 更大的效果。

【讨论】:

  • 我喜欢将多个匹配的正则表达式应用于过滤器之类的字符串的想法。但是这种方法肯定会使正则表达式 findall 和 sub 难以使用?
  • 是的,但是我提供的代码可以(再次)调整以找到匹配的所有实例(或找到实例的索引)。您可以编写函数的变体来执行findallsub 函数。您甚至可以制作一个模块,允许您将多个正则表达式编译成一个大型正则表达式对象并指定复杂的匹配行为(也许像superegex.compile("a^5 b^5", a="a regex", b="b regex"))以使这项工作更容易。它可能会更容易理解和维护(并且在将来您必须再次执行此工作时更有用)。
  • 另外,在询问正则表达式问题时,您仍应指定您使用的语言。不同的语言处理正则表达式的方式不同,因此即使我们可以为您提供纯正则表达式解决方案,它也可能不适用于您的语言的正则表达式风格。另外,如果我们认为您最好使用替代方法,告诉我们您正在使用(我认为)Python 会有所帮助。
猜你喜欢
  • 2011-11-23
  • 2017-11-03
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2013-12-24
  • 1970-01-01
  • 2014-10-11
相关资源
最近更新 更多