举例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个数字。
不匹配任何字符它不代表任何符号只是个标志(能够把单词与空格等其他符号区分),所以可以提取单词,标志单词的开始或者结束。
对于第二个例子就可以看出,它是提取单词所以就会把其它符号与单词分隔开,当然,只能是"@a“结果,左边是非单词符号,右边就是单词
第三个例子就代表一个单词的开头和结束,可以从一个字符串中将但单词提取出来,这个例子可以理解为是和”,"分离出来的完整单词
"(?<=\d{4})”是从开始检测到4个连续数字开始(不包括这4个)
“(?=\d{4})"是检测到4个数字为结束(不包括这四个字符 )
这样按照最大的来检测该字符串,符合这个条件的,所以取中间剩下的连续数字
第一个我再看看
为什么要4个连续的?不连续的结果也一样
首先: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,
这样对说有的来说总会剩下两个不显示.不知道我说的楼主是否明白,如有不正确,请大家指出,我也是想的这么认为的.
我把 <= 换成 = 结果是"123456789012" 为什么?例1 为什么剩最后2位不匹配?"(\w)((?=\1\1\1)(\1))+" 最后面的 (\1) 引用的是哪个? 是(\w) 吗,还是 (?=\1\1\1) ?
最后面的 "+" 是针对整个表达式,还是针对 ((?=\1\1\1)(\1)) 或则针对 (\w) ?
"(\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
<=是出现这个条件为开始,前面的条件不要,要其后面的结果
=是到出现这个条件为止,要在这之前面匹配的
还是那样楼主可以看出(?=\d{4})\d+这个的结果就是“1234567890123456”全部结果
当匹配1时可以说条件终止了,然后接着进行判断,取到最后,所以说(?=\d{4})\d+(?=\d{4})当再遇到第二个(?=\d{4})时终止,不会取道后四位
还有若拿"aaaa" 去匹配,结果是“aa” 为什么?====================================================================================To xiaolei1982(小磊)还是那样楼主可以看出(?=\d{4})\d+这个的结果就是“1234567890123456”全部结果=是到出现这个条件为止,要在这之前面匹配的
照你这么说,一开始遇到 1234 就符合“=”的条件了,取之前匹配的,结果应该是空才对。
照你这么说,一开始遇到 1234 就符合“=”的条件了,取之前匹配的,结果应该是空才对。不带"d+"就是空,带上了就是全部,因为开始取的空后面又出现连续的"d+"当然是全部的数字了
当然不是需要配套使用了,给你两个例子
“I'm singing while you're dancing” --\b\w+(?=ing\b) 会匹配sing和danc
“reading a book” --(?<=\bre)\w+\b 会匹配ading
看了这么多楼主一定会知道结果的喽
还有若拿"aaaa" 去匹配,结果是“aa” 为什么?
不是的楼主,你也可以“reading a book rewriting” --(?<=\bre)\w+\b 同样匹配两个ading和writing
这不是区别
“<=是出现这个条件为开始,前面的条件不要,要其后面的结果
=是到出现这个条件为止,要在这之前面匹配的”
你对对再想想
和
“reading a book rewriting” --(?=\bre)\w+\b
的结果一样吧
和
“reading a book rewriting” --(?=\bre)\w+\b
的结果一样吧
后面的条件就是值的(?=\bre)不要,要前面的
例子说的很清楚啊
和
“reading a book rewriting” --(?=\bre)\w+\b
的结果一样吧
第一个是 ading 和 writing
第二个是 reading 和rewriting
原理和上面给你说的一样
还有若拿"aaaa" 去匹配,结果是“aa” 为什么?
楼主可以考虑成f(( ( ?=fff )f )+ ),最后一个(\1) 是引用(\w) 的是没有问题的因为"\1"是分组写法即为第一个括号的数据
你可以看我给你写的:看上面的例子:第一个f是满足条件的终止然后紧接着例子的第四个f,但是针对所有的"+"的过程,
所以匹配第三个f,符合于是在加上紧接着的第四个f,这时就是ffff了,继续"+"过程,
第五个f不满足条件终止.
于是不管循环多少个,总会剩下最后连个f不匹配,楼主好好想想测试一下