分页: 1 / 1

[问题]正则表达式 "(\w)((?=\1\1\1)(\1))+"的解读

发表于 : 2007-12-18 23:20
JIAN
表达式 "(\w)((?=\1\1\1)(\1))+" 在匹配字符串 "aaa ffffff 999999999" 时,将可以匹配6个"f"的前4个,可以匹配9个"9"的前7个。这个表达式可以读解成:重复4次以上的字母数字,则匹配其剩下最后2位之前的部分。
为什么会解读成这样子的?
为什么会剩下最后两位没有匹配的?

发表于 : 2007-12-19 12:57
xiechy
(?=\1\1\1)表示该位置后面跟有3个\1

Re: [问题]正则表达式 "(\w)((?=\1\1\1)(\1))+"的解读

发表于 : 2008-01-15 10:34
patrickhe
JIAN 写了:表达式 "(\w)((?=\1\1\1)(\1))+" 在匹配字符串 "aaa ffffff 999999999" 时,将可以匹配6个"f"的前4个,可以匹配9个"9"的前7个。这个表达式可以读解成:重复4次以上的字母数字,则匹配其剩下最后2位之前的部分。
为什么会解读成这样子的?
为什么会剩下最后两位没有匹配的?
1. \w 先匹配到一个英数字符。
2. (?=\1\1\1)\1 匹配第一个 group 中匹配到的字符3次——表面上看这个表达式匹配了4个字符,实际上只要3个相同的字符就能满足匹配要求。加上之前的 \w,就是要求匹配重复一个4次以上的英数字符串。
3. 最后面的 + 限定了第二个 group: ((?=\1\1\1)\1),也就是要求在匹配字符之后至少存在3个或者3个以上的重复字符才能匹配成功,所以当匹配到重复字符串末尾只剩两个字符的时候,该表达式即不能匹配成功,所以最后2个重复字符是永远会被排除在匹配到的字符串之外的。

发表于 : 2008-01-15 20:19
JIAN
哦,明白了
谢谢!!!