论坛首页 综合技术论坛

关于正则表达式"(\w)((?=\1\1\1)(\1))+"的疑问

浏览 3075 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-05-25  
表达式 "(\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个重复字符是永远会被排除在匹配到的字符串之外的。


为什么实际上是匹配3个就行了
   发表时间:2008-05-25  
4楼说的对, 本回复之前说反了
0 请登录后投票
   发表时间:2008-05-27  
更新一下 还是不明白
0 请登录后投票
   发表时间:2008-05-31  
\w(?=\1\1\1)(\1) 中红色部分说明,这个位置的右边有三个\1就行了.当然,实际匹配时由于后面已经有了一个\1,所以只需要额外再有两个就行了(因此6个字符就匹配了前4个).

2楼的说反了方向.
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics