今天看了正则表达式/" ( \\. | [^"] )* "/x (我把该正则表达式记为regex) 来匹配字符串 "/-|-\\" or "[^_^]" (包括首尾双引号,我把该字符串记为string) , 于是自己对正则匹配时所保存的状态不是很确定,之前看过精通正则表达式的书,没有对这类情况分析。
于是我的设想是: 当regex匹配string第一个双引号之后就有三条路需要选择。当然尝试是按顺序的,如过尝试第一条路成功,那么perl会保存第二条和第三条路,当尝试了第二条路是成功的,那说明第一条路已经匹配失败,于是保存第三条路
第一条路:
regex从逗号这里开始: " ( ,\\. | [^"] )* "/x
string从逗号这里开始: ",/-|-\\" or "[^_^]"
第二条路:
regex从逗号这里开始: " ( \\. | ,[^"] )* "/x
string从逗号这里开始: ",/-|-\\" or "[^_^]"
第三条路:(也是我不确定的路,但实验证明这条路是正确的)
regex从逗号这里开始: " ( \\. | [^"] )* ,"/x
string从逗号这里开始: ",/-|-\\" or "[^_^]"
以下是我做的实验:
if ($line =~ m/
(
"
(
(?{print "1\n"}) \\. (?{print "$`|$'\n"})
|
(?{print "2\n"}) [^"] (?{print "$`|$'\n"})
)+
(?{print "3\n"})
"
(?{print "$`|$'\n"})
)
#让匹配失败
(?!)
/x)
{
print "it matched: $1\n";
}
实验前部分数据:
1
2
|-|-\\" or "[^_^]"
1
2
||-\\" or "[^_^]"
1
2
|-\\" or "[^_^]"
1
2
|\\" or "[^_^]"
1
|" or "[^_^]" (a)
1
2
3
| or "[^_^]" 到这里遇到(?!), 于是失败尝试最近所保存的状态(路)
到这里后便尝试 a那里保存的状态2(也就第二条路),但状态3还保留(此时regex为:" ( \\. |, [^"] )* "/x)
2
|\" or "[^_^]"
1
| or "[^_^]"
1
2
|or "[^_^]" (b)
1
2
|r "[^_^]"
1
2
| "[^_^]"
1
2
|"[^_^]" (c)
1
2
3
|[^_^]"
到这里匹配又失败,于是尝试之前所保存的状态,但之前从b到c总共保存4个都是状态3,所以下面尝试了4次
3
3
3
3
2
|" or "[^_^]"
好了到这里我就省略下面的分析,这就证明了我的设想是正确的即除了保留状态1和2外还保留了状态3.
阅读(1304) | 评论(3) | 转发(0) |
0
上一篇:没有了