前提:主要是说NFA引擎
1.匹配的正确性和效率。需要理解引擎的工作原理,关键要理解回溯的工作机制。
2.在传统NFA中,应该把匹配概率大的分支放在前面,因为传统NFA匹配成功后就继续后面的匹配而不回溯,这样通过减少回溯次数来提高效率。但是POSIX NFA任何情况下都会尝试所以的分支。 这中优化只在匹配成功的情况下有用,因为匹配失败时会尝试所以的分支的。在交换分支的时候需要考虑正确性。
3.限制匹配优先量词的作用范围。在多选分支的某个匹配概率大的分支中使用匹配优先量词,一次性匹配尽可能多的字符,从而减少测试次数以及回溯次数,以及退出和进入多选分支结构的次数,从而提高效率。
4.对于POSIX NFA如果某表达式受两个匹配优先量词限制,则回溯次数将时天文数字。对于传统NFA和POSIX NFA在匹配失败情况下,尝试次数是和字符串长度成几何增长的
5.
6.常用优化技巧
7.引擎工作的步骤
编译,如果语法没有问题就编译为内部形式
- 传动开始:将正则引擎定位到目标串的起始位置
- 元素检测:匹配失败则返回;控制权量词和限制词间轮换;控制权在捕获型括号内外轮换时开销较大
- 寻找匹配结果:如果有匹配结果传统NFA即报告成功,如果是POSIX NFA则继续尝试,最后从所有匹配中返回最长的
- 传动装置驱动过程:如果没有匹配,则移动到目标串的下一位置。
- 匹配失败:目标串的每一个位置都尝试后仍不能匹配则报告匹配失败
8.将重复使用的正则表达式编译并保存,避免重复编译浪费时间
9.把匹配成功必然会包含的字符(串)提取出来,某些工具可以对目标串做预检查,如果必然出现的字符(串)没有出现则不进行匹配。
10.锚点优化,减少驱动引擎驱动的位置
11.忽略优先量词通常比匹配优先量词慢
12.使用占有优先量词和固化分组减少备用状态,如果分组和后面的字符没有重叠,则可以做这样的优化。eg: \%(w+):
12.使用占有优先量词和固化分组减少备用状态,如果分组和后面的字符没有重叠,则可以做这样的优化。eg: \%(w+):