理解正则表达式

来源:互联网 发布:重庆开票软件电话 编辑:程序博客网 时间:2024/05/16 08:47

我对"(/w)((?=/1/1/1)(/1))+" 的理解:
(?=/1/1/1)修饰其后的(/1),在/w后有+个(/1),每个(/1)后必须接有三个/1(即/1/1/1)。(+修饰的是(/1))
对于预搜索与反向预搜索,意思就是从被修饰的字符开始向后搜索与向前搜索。

 


 

"(((?!uv)/w)+)"匹配"cccuvkkk ooouaaavkk"
第一个匹配的是:ccc
原理:
找到第一个c,从这个c本身开始预搜索,看是否匹配"uv"

所比较的两个部分没有相同,符合(?!uv)/w的条件,获取这个c,并从第一个u开始进行下一次预搜索


图4:第四次匹配判断

所比较的两个部分相同,不符合(?!uv)/w的条件,不获取这个u,结束这闪匹配,得到"ccc"

第二次匹配的结果:vkkk
原理:

第三次匹配:ooouaaavkk


<font>((?!</?font>).)*</font>
其中的 (?!</?font>) 是修饰 . 的,表示*个 . 中其中不包括</font>或<font>。

 


 

tags:预搜索,正则表达式
http://community.csdn.net/Expert/topic/4882/4882408.xml?temp=.1311609

第一个例子明白,但是第二个例子怎么想都想不明白,它的意思:重复4次以上的字母数字,则匹配其剩下最后2位之前的部分,这怎么理解


 举例1:表达式 "Windows (?=NT|XP)" 在匹配 "Windows 98, Windows NT, Windows 2000" 时,将只匹配 "Windows NT" 中的 "Windows ",其他的 "Windows " 字样则不被匹配。

    举例2:表达式 "(/w)((?=/1/1/1)(/1))+" 在匹配字符串 "aaa ffffff 999999999" 时,将可以匹配6个"f"的前4个,可以匹配9个"9"的前7个。这个表达式可以读解成:重复4次以上的字母数字,则匹配其剩下最后2位之前的部分。当然,这个表达式可以不这样写,在此的目的是作为演示之用。

=======================================================

/w 匹配包括下划线的任何单词字符。等价于 '[A-Za-z0-9_]'。

(?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

/num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)/1' 匹配两个连续的相同字符。

=======================================================

/1 代表 "反向引用"。意思是,第一组括号(在这里是 /w )匹配到了什么内容,则 /1 必须匹配一样的内容。

比如,在匹配 "fffff" 时,当 /w 匹配第一个 'f' 后,后边的 /1 都必须匹配 'f'

(?=/1/1/1) 表示 "正向预搜索",表示该位置右边,必须能够匹配 /1/1/1。如果前面的 /w 匹配了1个 'f',则 (?=/1/1/1) 要求右侧必须有 'fff'。这只是对这个缝隙的条件,实际上并没有进行匹配。真正进行匹配的是旁边的 /1。

整体来说,"(?=/1/1/1)/1" 的意思是:"如果右边有 3 个 'f' ,则匹配 1 个 'f' "


搂主可以在此基础上进行修改,然后看匹配的效果,以此来增进理解:
http://www.regexlab.com/zh/regref.htm

 


原创粉丝点击