通过传动装置进行优化
通过传动装置优化正则表达式时,即使正则引擎无法预知某个字符串能否匹配,也能减少传动装置真正应用正则表达式的次数!优化传动装置可以通过以下方面进行:
字符串起始/行锚点优化
这种优化措施能够判断,任何以^
开头的正则表达式只能在^
能够匹配的情况下才可能匹配,所以只需要在这些位置应用即可。例如下面这个例子:
javascript
// 未优化
console.time(); // 启动定时器
/^ako|^luv/.test("luv is ok");
console.timeEnd(); //结束定时器,输出用时 ==> default: 0.03515625 ms
// 优化后
console.time(); // 启动定时器
/^(?:ako|luv)/.test("luv is ok");
console.timeEnd(); //结束定时器,输出用时 ==> default: 0.010986328125 ms
由此可见,使用^(?:orz|luv)
代替^orz|^luv
能够显著的正则的提高匹配速度!
隐式锚点优化
若正则表达式以.*
或.+
开头,并且没有全局性多选结构,则认为此正则表达式在开头有一个看不见的^
。即使开头的.*
或.+
在括号内,也可以进行同样的优化,但是在遇见捕获型括号时情况就有了变化。
比如下例中,期望字符串X
两侧是相同的:
javascript
/(.+)X\1/.test("123X234"); // 返回True
/^(.+)X\1/.test("123X234"); // 返回false ==>这才是期望的结果
字符串结束/行锚点优化
该优化遇到末尾的$
或其他结束锚点的正则表达式时,会从字符串末尾倒数若干字符的位置开始尝试匹配。
比如正则表达式/Achoo(luv)?$/
匹配时只能从字符串末尾倒数第9
个字符开始匹配。
开头字符/字符组/子串识别优化
该优化能使传动装置进行快速子字符串检查,在字符串中的合适位置应用正则表达式。
比如this|that|other
只能从[ot]
的位置开始匹配,所以传动装置预先检查字符串中的每个字符,只在可能的位置进行尝试应用,这样就能节约大量的时间。能预先检查的子串越长,“错误的开始位置”就越少!
内嵌文字字符串检查优化
该优化针对的是匹配中固定位置出现的文字字符串,只有在内嵌文字字符串与表达式起始位置的距离固定时才能进行优化。
比如\b(www|luv)\.regexpjs\.com\b
能进行该优化,而\b(www|m)\.regexpjs\.com\b
则不行,因为字符串到匹配起始位置的距离不确定(3
个字符或 1
个字符)。
长度识别传动优化
该优化规则为:若当前位置距字符串末尾的长度小于成功匹配所需的最小长度,传动装置会停止匹配尝试。