Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14329
  • 博文数量: 3
  • 博客积分: 112
  • 博客等级: 民兵
  • 技术积分: 35
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-18 12:10
文章分类
文章存档

2013年(1)

2012年(2)

我的朋友
最近访客

分类: Python/Ruby

2012-08-15 16:31:37

今天看了正则表达式/" ( \\. | [^"] )* "/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.
阅读(1901) | 评论(3) | 转发(0) |
0

上一篇:没有了

下一篇:perl要注意的地方

给主人留下些什么吧!~~

oppqw2012-09-11 11:40:21

yizhengming: .....
么么

yizhengming2012-08-17 14:39:16

oppqw: 2哥。。。。我是你丁哥,,哥不知不觉做了沙发了.....

oppqw2012-08-17 14:15:58

2哥。。。。我是你丁哥,,哥不知不觉做了沙发了