关于正则表达式的问题
?当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能...
? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
(?!pattern) 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
第一段话不是很明白。第二段话完全不解! 展开
(?!pattern) 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
第一段话不是很明白。第二段话完全不解! 展开
1个回答
展开全部
第一段话:
比如对字符串
xxxxyyzzzxyzxyzzzz123
1.用
[xyz]*zzz这个贪婪表达式去匹配的时候
正则引擎的走法是先根据贪婪来匹配[xyz]*
由于一直符合字符xzy来组成,所以正则游标一直走到
xxxxyyzzzxyzxyzzzz,然后对后面的zzz做判断,发现后面是数字1,游标回溯,退到
xxxxyyzzzxyzxyzzz,再匹配zzz,发现后面z满足,但数字1不满足,再回溯,
退到
xxxxyyzzzxyzxyzz,发现后面是zz1,还是不满足zzz,再回溯,退到
xxxxyyzzzxyzxyz,这下发现后面是zzz了,符合[xyz]*zzz,ok,报告找到了
xxxxyyzzzxyzxyzzzz
2.用
[xyz]*?zzz这个非贪婪正则去匹配的时候,首先
找到x,看后面是不是zzz,不是,继续
找到xx,看后面是不是zzz,不是,继续
找到xxx,看后面是不是zzz,不是,继续
...
找到xxxxyy,看后面,发现是zzz,ok,报告找到了
xxxxyyzzz
注:当然这是由于有2个zzz地方,造成结果不同,如果在符合条件情况下,只有1处zzz,结果是一样的。根据实际情况来选取贪婪和非贪婪。
第二段话:
如果是一个循环查找比如java里面Matcher的while(m.find()),比如还是xxxxyyzzzxyzxyzzzz123
正则表达式([xyz]*?)zzz或者是([xyz]*?)(?:zzz)或者是([xyz]*?)(zzz)这种找“一串以zzz结尾的xyz组成的字符串”
第一轮正则判断找到xxxxyyzzz或者第一匹配组的xxxxyy之后,游标停在zzz后面
下一轮再找的时候,从zzz后面开始,找到xyzxyzzzz或者第一匹配组的xyzxyz
但如果是预查找([xyz]*?)(!=zzz) 这里用的是有,你那个是无,但仅仅意思相反,道理一样。这个第一轮找到xxxxyy,“游标在zzz前面”!第二轮从zzz前面开始找,找到zzzxyzxyz。
额。就这么个意思,不知道能帮到你不。
悬赏分:5分。。。
5分。。。
分。。。
比如对字符串
xxxxyyzzzxyzxyzzzz123
1.用
[xyz]*zzz这个贪婪表达式去匹配的时候
正则引擎的走法是先根据贪婪来匹配[xyz]*
由于一直符合字符xzy来组成,所以正则游标一直走到
xxxxyyzzzxyzxyzzzz,然后对后面的zzz做判断,发现后面是数字1,游标回溯,退到
xxxxyyzzzxyzxyzzz,再匹配zzz,发现后面z满足,但数字1不满足,再回溯,
退到
xxxxyyzzzxyzxyzz,发现后面是zz1,还是不满足zzz,再回溯,退到
xxxxyyzzzxyzxyz,这下发现后面是zzz了,符合[xyz]*zzz,ok,报告找到了
xxxxyyzzzxyzxyzzzz
2.用
[xyz]*?zzz这个非贪婪正则去匹配的时候,首先
找到x,看后面是不是zzz,不是,继续
找到xx,看后面是不是zzz,不是,继续
找到xxx,看后面是不是zzz,不是,继续
...
找到xxxxyy,看后面,发现是zzz,ok,报告找到了
xxxxyyzzz
注:当然这是由于有2个zzz地方,造成结果不同,如果在符合条件情况下,只有1处zzz,结果是一样的。根据实际情况来选取贪婪和非贪婪。
第二段话:
如果是一个循环查找比如java里面Matcher的while(m.find()),比如还是xxxxyyzzzxyzxyzzzz123
正则表达式([xyz]*?)zzz或者是([xyz]*?)(?:zzz)或者是([xyz]*?)(zzz)这种找“一串以zzz结尾的xyz组成的字符串”
第一轮正则判断找到xxxxyyzzz或者第一匹配组的xxxxyy之后,游标停在zzz后面
下一轮再找的时候,从zzz后面开始,找到xyzxyzzzz或者第一匹配组的xyzxyz
但如果是预查找([xyz]*?)(!=zzz) 这里用的是有,你那个是无,但仅仅意思相反,道理一样。这个第一轮找到xxxxyy,“游标在zzz前面”!第二轮从zzz前面开始找,找到zzzxyzxyz。
额。就这么个意思,不知道能帮到你不。
悬赏分:5分。。。
5分。。。
分。。。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询