日期:2014-05-20  浏览次数:20778 次

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


((?=\1\1\1)(\1))+这部分该怎么理解啊??? (?=\1\1\1),(\1),?? 月详细越好

------解决方案--------------------
首先你得理解“组”这个概念 拿这个例子来说 (\w) 就是第1组 \1代表第一组的引用 
(?=)有个专业的名称叫 通过零宽度的正 lookahead - -! 这个概念太搓了
这个例子里的(?=\1\1\1)简单的来说就是 如果 (断言) \w的右边还有3个\w就继续匹配 否则 匹配失败 但是这3个\w是不占地方滴 呵呵 又是一个很郁闷的概念
就是说 (?=\1\1\1)只是断言有 在继续执行正则匹配的时候 还是从\w那块开始 所以下面就轮到 (\1)了 这个简单 就是\w (?=\1\1\1)(\1)总体的意思 其实是 一个\w再+上两个\w的虚像占位 一个虚像被(\1)把位置占了
然后一个((?=\1\1\1)(\1))+表示重复 组内匹配 这样再匹配aaa的时候 正则表达式会检查 首先一个a 然后看右边 只有两个a 匹配失败 轮到 ffffff了 检查 一个 f 后面有3个f 匹配 然后从第2个 f开始数3个占位滴 加上第2个 第3个开始数3个占位的加上第3个... 这样一直可以匹配到第4个 9999那个一样的
------解决方案--------------------
看下下面帖子中,我在10楼的回复

http://topic.csdn.net/u/20081224/20/450c914e-384b-4930-b3e3-9580be66bfbb.html