正则表达式学习:引擎

引擎

  • DFA
  • 传统NFA
  • POSIX NFA

区分

  1. 传统型NFA支持忽略优先量词
  2. DFA不支持捕获型括号和回溯

普适规则

  1. 优先选择最左端的匹配结果
  2. 标准的匹配量词是匹配优先的

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
避免无休止匹配的重点
  1. special部分和normal部分匹配的开头不能重合
  2. normal部分至少匹配一个字符
  3. special部分必须固化
posted @ 2020-10-27 15:21  luoheng  阅读(113)  评论(0编辑  收藏  举报