首页 » 编写高质量代码:改善JavaScript程序的188个建议 » 编写高质量代码:改善JavaScript程序的188个建议全文在线阅读

《编写高质量代码:改善JavaScript程序的188个建议》建议38:正确认识正则表达式工作机制

关灯直达底部

有很多因素影响正则表达式的效率。首先,正则表达式适配的文本千差万别,部分匹配时比完全不匹配所用的时间要长。其次,每种浏览器的正则表达式引擎也有不同的内部优化。要有效使用正则表达式,重要的是理解它们的工作机制。一个正则表达式处理的基本步骤如下:

第1步,编译。在创建了一个正则表达式对象后,浏览器先要检查模板有没有错误,然后将它转换成一个本机代码例程,用于执行匹配工作。如果将正则表达式赋给一个变量,就可以避免重复执行此步骤。

第2步,设置起始位置。当一个正则表达式投入使用时,要先确定目标字符串中开始搜索的位置。它是字符串的起始位置,或者由正则表达式的lastIndex属性指定,但当它从第4步返回到这里的时候,此位置将位于最后一次尝试起始位置推后一个字符的位置上。

浏览器厂商优化正则表达式引擎的方法:在这一阶段中通过早期预测跳过一些不必要的工作。例如,如果一个正则表达式以^开头,IE和Chrome浏览器通常判断在字符串起始位置上是否能够匹配,进而避免不明智地搜索后续位置。另一个例子是匹配第三个字母是x的字符串,聪明的方法是先找到x,然后再将起始位置回溯两个字符。

第3步,匹配每个正则表达式的字元。正则表达式一旦找好起始位置,将会一个个地扫描目标文本和正则表达式模板。当一个特定字元匹配失败时,正则表达式将试图回溯到扫描之前的位置上,然后进入正则表达式其他可能的路径。

第4步,匹配成功或失败。如果在字符串的当前位置上发现一个完全匹配的字符,那么正则表达式宣布成功。如果正则表达式的所有可能路径都尝试过了,但没有成功匹配,那么正则表达式引擎回到第2步,从字符串的下一个字符重新尝试。只有字符串中的每个字符(以及最后一个字符后面的位置)都经历了这样的过程之后还没有成功匹配,正则表达式才会宣布彻底失败。

牢记这一过程将有助于判别那些影响正则表达式性能问题的类型。