看起来两者都(a|e|i|o|u)?
具有[aeiou]?
相同的效果,我想知道性能上是否有任何显着差异。
2 回答
在您给出的示例中,使用类而不是交替有一个显着的好处。
例如:
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对正在发生的事情有很好的详细描述。
以上都将匹配相同的东西,但不同之处在于 [AEIOU] 将启动一个字符类。而不是写出 (1|2|3|4|5) 你可以简单地写出 [1-5],它会被解释为同样的事情。使用另一种方法,您每次都需要重新声明您想要匹配的所有内容。
更多内容可以在这里阅读http://www.regular-expressions.info/charclass.html