3

看起来两者都(a|e|i|o|u)? 具有[aeiou]?相同的效果,我想知道性能上是否有任何显着差异。

4

2 回答 2

4

在您给出的示例中,使用类而不是交替有一个显着的好处。

例如:

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

将 regex1 或 regex2 应用于该字符串将失败,但是幕后发生了什么?

Regex1 获取字符串的第一个字符并查看它是否与正则表达式匹配,因此它会根据匹配的 (a|e|i|o|u) 检查 'a',但是正则表达式引擎还指出,还有 4 种其他替代可能是测试这个是否稍后失败。然后它获取字符串的第二个字符并将其与正则表达式“c”的第二个原子组匹配这会导致正则表达式失败,但是它仍然有 4 个其他“状态”可以用来尝试进行匹配,因此正则表达式在决定正则表达式将完全失败并退出之前,引擎将后退一步并尝试将字符串的第一个字符与 eiou 匹配。

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

正则表达式内部的工作原理还有很多,因为有两种类型的引擎(确定性和非确定性),但如果您有兴趣阅读更多正则表达式。info对正在发生的事情有很好的详细描述。

于 2013-01-24T08:22:57.427 回答
0

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

更多内容可以在这里阅读http://www.regular-expressions.info/charclass.html

于 2013-01-24T08:13:16.463 回答