RegEx计算不同排列的数量

时间:2012-09-14 14:09:28

标签: php ruby regex

所以这有点使用RegEx;我想计算特定模式匹配的不同字符串的数字(或表示无限的,如果合适)。

例如,让我们考虑[a-zA-Z]会产生52,[a-zA-Z]{1,2}会产生2652(52 + 52×52-52×2;对于像aa这样的字符串减去52×2, MM(不是明显的)或[a-zA-Z]+,它们将是∞。

当然我希望这种机制能够处理比这更复杂的正则表达式。我对PHP和Ruby的解决方案特别感兴趣。这甚至可能吗?

2 个答案:

答案 0 :(得分:3)

正则表达式用于通过将给定字符串与给定字符串进行比较来匹配给定字符串。任何给定的正则表达式都可以匹配大量字符串,正则表达式越长,它可以匹配的字符串越多。

在我看来,你所追求的是无法用正则表达式完成的。您可以编写一个解构正则表达式的程序,并尝试猜测您可以匹配的字符串数量。尽管如此,这样的程序的构建很可能不会是微不足道的。

例如,在您的情况下,[a-zA-Z]不仅会匹配az(大写变体也相同),但它也会匹配任何字符串其中包含那些字母,它们基本上是您能想象到的任何字符串,其中至少包含其中一个字母。

添加^$锚点可能会减少点击次数,但是再一次,你仍然会超过48次,因为有时你也可以认为{EmptyString}a{EmptyString}也可以由^a$匹配,这使得可能的结果量非常大。

答案 1 :(得分:2)

为了完成这项任务,我认为你需要一个比正则表达式引擎本身更复杂的解决方案。正则表达式引擎只是“测试”(和“捕获”,但其复杂性是微不足道的),而在您的任务中,您希望测试潜在输入的整个话语(当然,完全不切实际),或演绎数学上潜在输入的数量。但请注意,为了推断潜在输入的数量,您不可避免地必须逐步执行与正则表达式引擎相同的步骤,除非在每一步询问“这个原子的潜在输入?”

我不确定你想要这样一个计数器的目的,但是如果你想要做的就是比较两个正则表达式的潜在输入的大小,那么我建议使用采样方法,生成一大组随机字符串,并计算每个正则表达式匹配的字符串数量。 (而且这种情况过于高调并且具有高度的推测性,但由于纯随机字符串不太可能表现出自然语言的分组模式,因此您可能必须使用分形技术生成样本, a la Mandelbrot。)

现在,如果你想走演绎计算的道路,这里有两个可能有助于简化问题的想法:

  1. 如果您找到*+(未转义但不在字符类中),那么您就知道答案是无限的。同样适用于{M,}。编辑:嗯,除非量词是一个“不可能”的正则表达式,例如(.*(?=a)(?=b)),其中断言下一个字符必须是“a”和“b”!

  2. 您可以将许多表达式扩展为交替语句,这样无论您的最终解决方案是什么,它都可以完全忽略字符类和量词,只关注每个交替组的原子数(可以相乘) ,例如

    1. [0-9a-f]等字符类可以扩展为0123456789abcdef,后者又可以扩展为(?:0|1|2|...|d|e|f)

    2. 有限量词如x? aka x{0,1}),x{M,N}x{,N}可以扩展为{{1} },(?:|x)等等。

  3. 祝你好运!