举例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),?? 月详细越好

解决方案 »

  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那个一样的 
      

  2.   

    首先你得理解“组”这个概念 拿这个例子来说 (\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那个一样的 
      

  3.   

    首先你得理解“组”这个概念 拿这个例子来说 (\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那个一样的 
      

  4.   

    看下下面帖子中,我在10楼的回复http://topic.csdn.net/u/20081224/20/450c914e-384b-4930-b3e3-9580be66bfbb.html