比较好奇正则表达式是如何实现匹配的?
正好在看精通正则表达式的第四章匹配原理,有两种模式,表达式主导和文本主导。
我推荐你去看这篇文章表达式主导与文本主导
只能帮你到这里了。
编译原理中有介绍怎么通过有限自动机去解析一个正则表达式的。具体可以参考龙书《编译原理》。
要理解 正则, 尤其是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)?/ 这一节, 百看不厌.