表达式 "(\w)((?=\1\1\1)(\1))+" 在匹配字符串 "aaa ffffff 999999999" 时,将可以匹配6个"f"的前4个,可以匹配9个"9"的前7个。这个表达式可以读解成:重复4次以上的字母数字,则匹配其剩下最后2位之前的部分。
为什么会解读成这样子的?
为什么会剩下最后两位没有匹配的?
[问题]正则表达式 "(\w)((?=\1\1\1)(\1))+"的解读
-
- 帖子: 63
- 注册时间: 2007-01-13 14:55
- patrickhe
- 帖子: 681
- 注册时间: 2005-07-21 19:13
- 来自: Peking, China
- 联系:
Re: [问题]正则表达式 "(\w)((?=\1\1\1)(\1))+"的解读
1. \w 先匹配到一个英数字符。JIAN 写了:表达式 "(\w)((?=\1\1\1)(\1))+" 在匹配字符串 "aaa ffffff 999999999" 时,将可以匹配6个"f"的前4个,可以匹配9个"9"的前7个。这个表达式可以读解成:重复4次以上的字母数字,则匹配其剩下最后2位之前的部分。
为什么会解读成这样子的?
为什么会剩下最后两位没有匹配的?
2. (?=\1\1\1)\1 匹配第一个 group 中匹配到的字符3次——表面上看这个表达式匹配了4个字符,实际上只要3个相同的字符就能满足匹配要求。加上之前的 \w,就是要求匹配重复一个4次以上的英数字符串。
3. 最后面的 + 限定了第二个 group: ((?=\1\1\1)\1),也就是要求在匹配字符之后至少存在3个或者3个以上的重复字符才能匹配成功,所以当匹配到重复字符串末尾只剩两个字符的时候,该表达式即不能匹配成功,所以最后2个重复字符是永远会被排除在匹配到的字符串之外的。