正则表达式学习:引擎
引擎
目录
- DFA
- 传统NFA
- POSIX NFA
区分
- 传统型NFA支持忽略优先量词
- DFA不支持捕获型括号和回溯
普适规则
- 优先选择最左端的匹配结果
- 标准的匹配量词是匹配优先的
DFA与NFA
NFA 表达式主导
DFA 文本主导
-
DFA匹配迅速
-
DFA匹配很一致
-
最左最长规则
传统NFA优化
优化1:合理安排次序,减少回溯次数
“|“多选结构按序排列,合理安排次序,减少回溯次数。将最有可能匹配的分支放在最前面,可以减少NFA引擎的回溯次数。
实例 匹配含转义的字符串
"2\"x3\" likeness"
正则表达式
"(\\.|[^"\\])*"
优化
"([^"\\]|\\.)*"
优化2:将文本独立出来
引擎可能优化文字文本。
x+ ---> xx*
-{5,7} ---> ------{0, 2}
(?:this|that) ---> th(?:is|at)
优化3:将锚点独立出来
引擎可能优化锚点。
^abc|^123 ---> ^(?:abc|123)
(^abc) ---> ^(abc)
abc$|123$ ---> (?:abc|123)$
优化4:模拟开头字符识别
[JFMASOND](?:(?<=J)an|(?<=F)eb|...|(?<=D)ec)
优化5:使用固化分组和占有优先量词
^[^:]+: ---> ^(?>[^:]+): or ^[^:]++:
优化6:消除循环
(this|that|...)* ---> * 代表的意义
方法一:依据经验
例子
"he said \"hi there\" and left"
正则表达式
"[^\\"]+\\.[^\\"]+\\.[^\\"]+"
"[^\\"]*(\\.[^\\"]*)*"
模式
normal+(special normal+)*
消除循环
opening normal* (special normal*)* closing
避免无休止匹配的重点
- special部分和normal部分匹配的开头不能重合
- normal部分至少匹配一个字符
- special部分必须固化