举例1:表达式 "(\w)((?=\1\1\1)(\1))+" 在匹配字符串 "aaa ffffff 999999999" 时,将可以匹配6个"f"的前4个,可以匹配9个"9"的前7个。这个表达式可以读解成:重复4次以上的字母数字,则匹配其剩下最后2位之前的部分 举例2:表达式 ".\b." 在匹配 "@@@abc" 时,匹配结果是:成功;匹配到的内容是:"@a";匹配到的位置是:开始于2,结束于4。  举例3:表达式 "\bend\b" 在匹配 "weekend,endfor,end" 时,匹配结果是:成功;匹配到的内容是:"end";匹配到的位置是:开始于15,结束于18。 举例4:表达式 "(?<=\d{4})\d+(?=\d{4})" 在匹配 "1234567890123456" 时,将匹配除了前4个数字和后4个数字之外的中间8个数字。

解决方案 »

  1.   

    第二个,\b --匹配一个单词边界,也就是单词和空格之间的位置。
    不匹配任何字符它不代表任何符号只是个标志(能够把单词与空格等其他符号区分),所以可以提取单词,标志单词的开始或者结束。
    对于第二个例子就可以看出,它是提取单词所以就会把其它符号与单词分隔开,当然,只能是"@a“结果,左边是非单词符号,右边就是单词
    第三个例子就代表一个单词的开头和结束,可以从一个字符串中将但单词提取出来,这个例子可以理解为是和”,"分离出来的完整单词
    "(?<=\d{4})”是从开始检测到4个连续数字开始(不包括这4个)
    “(?=\d{4})"是检测到4个数字为结束(不包括这四个字符 )
    这样按照最大的来检测该字符串,符合这个条件的,所以取中间剩下的连续数字
    第一个我再看看
      

  2.   

    谢谢 xiaolei1982(小磊) 例2 例3 解决了但例4  "(?<=\d{4})”是从开始检测到4个连续数字开始(不包括这4个) 
           为什么要4个连续的?不连续的结果也一样
      

  3.   

    第一中怪麻烦的不容易理解:
    首先:1: "(\w)((?=\1\1\1)(\1))" 结果:ff,ff,99,99,99
    2: (\w)(?=\1\1\1)(\1)+ 结果:ffffff,999999999(全部显示)
    (?=\1\1\1)就是到遇到三个重复的为止
    这样1情况就会先检测到第一个f终止,可后面会遇到(\1)这个时候就是ff结束.当下一个检测到当第三个f时会有三个重复的所以再加一个f结束.当第五个时不满足终止
    第二个意思就是遇到第一个f终止,然后(\1)+所以就会把所有的都显示出来结束.
    所以楼主提的那个问题答案就是那样,"(\w)((?=\1\1\1)(\1))+" 是对(?=\1\1\1)(\1))整个的"+"运算 所以
    当遇到第一个f时终止加上一个f,然后对第三个继续象上面的1情况满足,所以再加上两个f,当第五个f时不满足结束.这样就会得到ffff,
    这样对说有的来说总会剩下两个不显示.不知道我说的楼主是否明白,如有不正确,请大家指出,我也是想的这么认为的.
      

  4.   

    看我的博客帖子里2条最重要的规则http://blog.joycode.com/saucer/archive/2006/10/11/84963.aspx1。(\w)((?=\1\1\1)(\1))+((?=\1\1\1)(\1))是说,匹配跟前面第一个括号里的字符一样的字符,但只有这个字符后面还会重复2次,才算匹配。当匹配计算移到ffffff中第一个f时,只有第二,三,四个f才符合这样的条件,因为“+”是贪婪的,所以,整个匹配包括前四个f。同理,到999999999中的第一9时,第二到7个9才符合这样的条件,所以,整个匹配包括前7个9。2。.\b是说匹配单词的边界(word boundary)前一个字符,“@@@abc”的单词边界在第一个@前面,a前面,c后面,匹配结果是,a前面的那个@,还有c3。\bend\b是说,这个end前后都有词的边界,只有字符串最后的end才符合这样的条件4。(?<=\d{4})\d+(?=\d{4})是说,这个子字符串都是数字,而且前面有4个数字,后面也有4个数字,在匹配计算移动到前4个数字时,都不满足这样的条件,当移动到5时,可以看出,“6789012”都满足这样的条件(因为它们后面都有4个数字),但到后面那个3时,就不满足条件了,因为“+”是贪婪的,所以,整个匹配结果是“56789012”
      

  5.   

    纠正,2。“@@@abc”的单词边界有2个,一个在a前面,一个在c后面
      

  6.   

    谢谢你们例4的<= 和 = 有什么区别?
    我把 <= 换成 = 结果是"123456789012" 为什么?例1 为什么剩最后2位不匹配?"(\w)((?=\1\1\1)(\1))+"  最后面的 (\1) 引用的是哪个? 是(\w) 吗,还是 (?=\1\1\1) ?
    最后面的 "+" 是针对整个表达式,还是针对 ((?=\1\1\1)(\1)) 或则针对 (\w) ?
      

  7.   

    零宽度断言表明的是一种匹配条件,(?<= 是零宽度正回顾后发断言(即匹配前面),(?=是零宽度正预测先行断言(即匹配后面)
    "(\w)((?=\1\1\1)(\1))+"假如(\w)匹配的是f,那么这个表达式就像是f((?=fff)f)+就是说,后面这部分将匹配任何f,但条件是,这个f后面还有2个f(所以合起来是连续3个f,但这只是匹配条件,匹配的字符是第一个f),对整个ffffff字符串来说,符合这样的条件的f是第2个-第4个f,加上早先匹配的那个f,该表达式匹配匹配前4个f
      

  8.   

    第5个f后面只有一个f,第6个f后面没有f,所以不满足(?=fff)的条件
      

  9.   

    例4的<= 和 = 有什么区别?
    <=是出现这个条件为开始,前面的条件不要,要其后面的结果
    =是到出现这个条件为止,要在这之前面匹配的
    还是那样楼主可以看出(?=\d{4})\d+这个的结果就是“1234567890123456”全部结果
    当匹配1时可以说条件终止了,然后接着进行判断,取到最后,所以说(?=\d{4})\d+(?=\d{4})当再遇到第二个(?=\d{4})时终止,不会取道后四位
      

  10.   

    To saucer(思归) "(\w)((?=\1\1\1)(\1))+"假如(\w)匹配的是f,那么这个表达式就像是f((?=fff)f)+照这么说,最后一个(\1) 是引用(\w) 的了,那"+" 是针对哪块的?
    还有若拿"aaaa" 去匹配,结果是“aa” 为什么?====================================================================================To xiaolei1982(小磊)还是那样楼主可以看出(?=\d{4})\d+这个的结果就是“1234567890123456”全部结果=是到出现这个条件为止,要在这之前面匹配的
    照你这么说,一开始遇到 1234 就符合“=”的条件了,取之前匹配的,结果应该是空才对。
      

  11.   

    To xiaolei1982(小磊)还是那样楼主可以看出(?=\d{4})\d+这个的结果就是“1234567890123456”全部结果=是到出现这个条件为止,要在这之前面匹配的
    照你这么说,一开始遇到 1234 就符合“=”的条件了,取之前匹配的,结果应该是空才对。不带"d+"就是空,带上了就是全部,因为开始取的空后面又出现连续的"d+"当然是全部的数字了
      

  12.   

    (?<=\d{4})\d+  前面的部分你带不带 d+  结果是一样的
      

  13.   

    (?<=\d{4})\d+  前面的部分带不带 d+  结果是一样的
      

  14.   

    结果肯定不不一样:(
    当然不是需要配套使用了,给你两个例子
    “I'm singing while you're dancing”   --\b\w+(?=ing\b)   会匹配sing和danc
    “reading a book”   --(?<=\bre)\w+\b    会匹配ading 
    看了这么多楼主一定会知道结果的喽
      

  15.   

    To saucer(思归) "(\w)((?=\1\1\1)(\1))+"假如(\w)匹配的是f,那么这个表达式就像是f((?=fff)f)+照这么说,最后一个(\1) 是引用(\w) 的了,那"+" 是针对哪块的?
    还有若拿"aaaa" 去匹配,结果是“aa” 为什么?
      

  16.   

    区别在于 ?= 可以匹配多个,<= 最多匹配一个?
    不是的楼主,你也可以“reading a book  rewriting”   --(?<=\bre)\w+\b    同样匹配两个ading和writing
    这不是区别
    “<=是出现这个条件为开始,前面的条件不要,要其后面的结果
      =是到出现这个条件为止,要在这之前面匹配的”
    你对对再想想
      

  17.   

    “前面的条件不要”是什么意思?“reading a book  rewriting”   --(?<=\bre)\w+\b 

    “reading a book  rewriting”   --(?=\bre)\w+\b 
    的结果一样吧
      

  18.   

    “前面的条件不要”是什么意思?“reading a book  rewriting”   --(?<=\bre)\w+\b 

    “reading a book  rewriting”   --(?=\bre)\w+\b 
    的结果一样吧
      

  19.   

    前面的条件就是指的(?<=\bre)不要,要后面的
    后面的条件就是值的(?=\bre)不要,要前面的
    例子说的很清楚啊
      

  20.   

    “reading a book  rewriting”   --(?<=\bre)\w+\b 

    “reading a book  rewriting”   --(?=\bre)\w+\b 
    的结果一样吧
      

  21.   

    当然不一样,楼主你到底是什么意思
    第一个是 ading 和 writing
    第二个是 reading 和rewriting
    原理和上面给你说的一样
      

  22.   

    哦,明白。那你帮我看看给 saucer(思归)  的问题吧,谢谢!"(\w)((?=\1\1\1)(\1))+"假如(\w)匹配的是f,那么这个表达式就像是f((?=fff)f)+照这么说,最后一个(\1) 是引用(\w) 的了,那"+" 是针对哪块的?
    还有若拿"aaaa" 去匹配,结果是“aa” 为什么?
      

  23.   

    首先+号一定对整个((?=\1\1\1)(\1))进行的“+”
    楼主可以考虑成f(( ( ?=fff )f )+ ),最后一个(\1) 是引用(\w) 的是没有问题的因为"\1"是分组写法即为第一个括号的数据
    你可以看我给你写的:看上面的例子:第一个f是满足条件的终止然后紧接着例子的第四个f,但是针对所有的"+"的过程,
    所以匹配第三个f,符合于是在加上紧接着的第四个f,这时就是ffff了,继续"+"过程,
    第五个f不满足条件终止.
    于是不管循环多少个,总会剩下最后连个f不匹配,楼主好好想想测试一下
      

  24.   

    如果你仔细读一下文档的话,这些零宽度断言什么的,都是额外的匹配条件,最后匹配的字符串是不在这些零宽度断言括号里的东西f((?=fff)f)+所以,那个+是针对后面这个括号的f, 相当于f(f)+(?=fff)则提出了进一步的条件,在这里是说,上面这个括号里的f后面必需还有2个f,才能包括进整个匹配字符串。如果没这个条件,那么所有的f都匹配进去了aaaa同理a((?=aaa)a)+   括号里的只匹配第二个a,整个表达式匹配前2个a