`(a | e | i | o | u)之间的正则表达式? `和`([aeiou])?`

时间:2013-01-24 08:05:46

标签: regex performance

它认为(a|e|i|o|u)?[aeiou]?都有相同的效果,我想知道性能是否有任何显着差异。

2 个答案:

答案 0 :(得分:4)

在您给出的示例中,使用该类比交替更有效。

例如:

string 'abcde'
regex1 /(a|e|i|o|u)cde/
regex2 /[aeiou]cde/

将regex1或regex2应用于该字符串会失败但是引擎盖下会发生什么?

Regex1获取字符串的第一个字符并查看是否与正则表达式匹配,因此它检查“a”与(a | e | i | o | u)匹配,但正则表达式引擎还注意到还有4个其他更改如果这个失败以后可以测试。然后它接受字符串的第二个字符,并将其与正则表达式'c'的第二个原子组相匹配。这会导致正则表达式失败,但是它仍然有4个其他'状态',它可以用来尝试匹配所以正则表达式引擎将返回一步并尝试匹配字符串的第一个字符与eiou匹配,然后再确定正则表达式将完全失败并退出。

另一方面,正则表达式2决定字符串'a'的第一个字符是类[aeiou]中的一个字符,没有创建更多状态,因此当第二个字符无法匹配时,它会以失败退出,比regex1快得多。

正则表达式内部的工作方式还有很多,因为有两种类型的引擎(确定性和非确定性)但是如果你有兴趣阅读更多regular-expressions.info有一个非常详细的描述正在发生什么上。

答案 1 :(得分:0)

以上都会匹配相同的东西,但区别在于[AEIOU]会启动一个角色类。而不是写出(1 | 2 | 3 | 4 | 5)你可以简单地写出[1-5],它将被解释为相同的东西。使用其他方法,您需要重新声明每次想要匹配的所有内容。

可在此处阅读更多内容http://www.regular-expressions.info/charclass.html