首页 > 正则表达式引擎本身是如何做匹配的

正则表达式引擎本身是如何做匹配的

比较好奇正则表达式是如何实现匹配的?


正好在看精通正则表达式的第四章匹配原理,有两种模式,表达式主导和文本主导。
我推荐你去看这篇文章表达式主导与文本主导
只能帮你到这里了。


编译原理中有介绍怎么通过有限自动机去解析一个正则表达式的。具体可以参考龙书《编译原理》。


要理解 正则, 尤其是pcre, 当然学一点perl比较好了. 我们甚至可以在perl里debug 正则:

C:>perl -e "use re debug; $_='x1abc'; /\d{2}|\dabc/;"
Compiling REx "\d{2}|\dabc"
Final program:
   1: BRANCH (5)
   2:   CURLY {2,2} (9)
   4:     DIGIT (0)
   5: BRANCH (FAIL)
   6:   DIGIT (7)
   7:   EXACT <abc> (9)
   9: END (0)
minlen 2
Matching REx "\d{2}|\dabc" against "x1abc"
   0 <> <x1abc>              |  1:BRANCH(5)
   0 <> <x1abc>              |  2:  CURLY {2,2}(9)
                                    DIGIT can match 0 times out of 2...
                                    failed...
   0 <> <x1abc>              |  5:BRANCH(9)
   0 <> <x1abc>              |  6:  DIGIT(7)
                                    failed...
                                  BRANCH failed...
   1 <x> <1abc>              |  1:BRANCH(5)
   1 <x> <1abc>              |  2:  CURLY {2,2}(9)
                                    DIGIT can match 1 times out of 2...
                                    failed...
   1 <x> <1abc>              |  5:BRANCH(9)
   1 <x> <1abc>              |  6:  DIGIT(7)
   2 <x1> <abc>              |  7:  EXACT <abc>(9)
   5 <x1abc> <>              |  9:  END(0)
Match successful!
Freeing REx: "\d{2}|\dabc"

这个例子给出了 编译后的正则程序(可以在perl 正则引擎上跑). 大概解读一下, BRANCH表示 分组, 两个分组, 第一个匹配 两个 数字(CURLY {2,2} 表示两个, DIGIT数字); 第二个分组 是 一个数字(DIGIT), 然后abc(EXACT ).

具体匹配的过程, perl也给出来了. 从x开始, 两个分组都匹配不成功. 接着匹配 1, 第一个分组还是fail, 然后在第二个分组匹配成功.

你可以自己写很多regex, 去具体看perl是怎么执行的, 可以飞快提升 正则功力.

perl regex debug:
http://perldoc.perl.org/perldebguts.html#Debugging-Regular-Expressions

推荐阅读<< programming perl >>, 第四版, 第五章. 尤其是The Little Engine That /Could(n’t)?/ 这一节, 百看不厌.

【热门文章】
【热门文章】