php 正则 回溯,对正则表达式回溯的理解

今天看了正则表达式/" ( \\. | [^"] )* "/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

上一篇:没有了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值