一个正则表达式的答案

一个正则表达式的答案

用正则式(\w)((?=\1\1\1)(\1))+ 去匹配aaa ffffff 999999999时,感觉应该如下解释次正则式
首先一个字母或者数字,紧接着在这个字母后要有3个连续的同样的数字或者字母,在接着是同样的字母或者数字。(后俩句话最少出现一次)

可是匹配的结果是这样的:
         标准    个人认为
第一次
          ffff     fffff
第二次
         9999999 999999999

自己的想法和标准答案有些出入,忘大家赐教?
首先你要明白?=匹配的是一个位置

QUOTE:
((?=\1\1\1)(\1))+

你这个匹配的是诸如xxx这样字符串的第一个x,
碰到(?..就头疼
个人感觉还应该 (?=\1\1\1)作为一个整体,而不是单单的?=\1,
但是按照个人的理解现在还没想透为什么会是标准答案的形式。
我记得原来看书说"?="这种形式。不会匹配任何,他只匹配第一个f后面的那个“位置”。


QUOTE:
原帖由 zhucy_ares 于 2008-10-22 12:46 发表
我记得原来看书说"?="这种形式。不会匹配任何,他只匹配第一个f后面的那个“位置”。

正解
oh my god....这个好难的说。(?= 这个东西似乎不是那么好理解哈。

(?=   : 顺序环视

也就是说, (?= pattern ) 匹配从当前位置开始,后面的字符串匹配pattern的那个位置。

例如: 字符串为  helloabcdefg ,正则表达式为 (?=abc),
它匹配的是 [] 的地方: hello[]abcdefg
注意没?它匹配的是一个“位置”,长度为零,而这个位置的条件就是,它后面有abc。

相应地,类似的符号有:
(?=   顺序环视,即匹配右侧有pattern的那个位置
(?!   顺序否定环视,即匹配右侧没有pattern的那个位置
(?<=  逆序环视,即匹配左侧有pattern的那个位置
(?<!  逆序否定环视,即匹配左侧没有pattern的那个位置

好,回到lz的问题。

分析一下这个正则表达式:

[Copy to clipboard] [ - ]
CODE:
    (\w)                             # 捕获任意一个字符
      (
        (?=\1\1\1)               # 从连续的三个\1左侧的那个位置开始……
        (\1)                          # 匹配一个 \1
      )+

具体到实际的字符串,就是这个样子:

1. aaa

首先  (\w)  --->  第一个 a
然后  (?=\1\1\1) 要匹配三个a,但是现在只剩下两个a了,失败。


2. ffffff
首先 (\w)  ---> 第一个 f
然后  (?=\1\1\1) 要匹配三个f左侧的位置,也就是说,2,3,4号f的左侧的位置,即1号和2号f中间;
最后,(\1) 匹配一个 f,即2号f。
括号内匹配完毕,继续 + 的下一轮。
因为现在 (\w) 和 (\1) 已经吃掉了两个字符了(注意(?=)不会吃掉任何字符,因为它宽度是0)
接下来 (?=\1\1\1) 就要匹配 3,4,5号f的左侧
然后(\1)匹配3号f
继续下一轮……
最后直到只剩下最后两个f时,(?=\1\1\1)不能匹配了,失败。
所以最后结果是 ffff。

3. 999999999
从2中可以看到,其实它匹配的就是连续的字母-去掉最后两个字母。
所以这个结果就是 9999999 了,自己分析吧。
讲的很清楚
odacharlee 讲得太精辟了,请问你是怎样学来的?
PFPF
#9

有70块钱没?去买本《精通正则表达式》,看完就全懂了。