abcabc92123abc/abc/g 匹配 abc
/(abc)*/g 匹配 abcabc 贪婪
/.*abc/g 匹配 abcabc92123abc 贪婪
/.*?abc/g 匹配 abc, 92123abc 惰性
/.*(abc)*/g 匹配 abcabc92123abc 贪婪
/.*?(abc)*/g 匹配 abcabc 前惰性后贪婪
/.*?(abc)*?/g 匹配 abc 92123abc 都惰性请教我的理解对吗? 请帮忙指出错误,谢谢大家。因为自己真的有点浑!
谢谢
/(abc)*/g 匹配 abcabc 贪婪
/.*abc/g 匹配 abcabc92123abc 贪婪
/.*?abc/g 匹配 abc, 92123abc 惰性
/.*(abc)*/g 匹配 abcabc92123abc 贪婪
/.*?(abc)*/g 匹配 abcabc 前惰性后贪婪
/.*?(abc)*?/g 匹配 abc 92123abc 都惰性请教我的理解对吗? 请帮忙指出错误,谢谢大家。因为自己真的有点浑!
谢谢
运行一下才是真理<script>
str="abcabc92123abc"
arr=[/abc/g,/(abc)*/g,/.*abc/g,/.*?abc/g,/.*(abc)*/g,/.*?(abc)*/g,/.*?(abc)*?/g];
for(i=0;i<arr.length;i++)
alert(arr[i].exec(str));
</script>
/abc/g 匹配 abc 运行结果 abc
/(abc)*/g 匹配 abcabc 运行结果 abcabc abc
/.*abc/g 匹配 abcabc92123abc 运行结果 abcabc92123abc
/.*?abc/g 匹配 abc, 92123abc 运行结果 abc
/.*(abc)*/g 匹配 abcabc92123abc 运行结果 abcabc92123abc
/.*?(abc)*/g 匹配 abcabc 运行结果 abcabc abc
/.*?(abc)*?/g 匹配 abc 92123abc 运行结果 ,
真是迷糊了,最后一个竟然出来串逗号
达人能具体点评下么? 真的要弄清楚哦
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>
<body>
<span id="ospan"></span>
<script>
str="abcabc92123abc"
arr=[/abc/g,/(abc)*/g,/.*abc/g,/.*?abc/g,/.*(abc)*/g,/.*?(abc)*/g,/.*?(abc)*?/g];
for(i=0;i<arr.length;i++){
document.getElementById("ospan").innerHTML +="第"+i+"项结果: " + str.match(arr[i])[0] + "<br/>";
}
/*
第0项结果: abc
第1项结果: abcabc
第2项结果: abcabc92123abc
第3项结果: abc
第4项结果: abcabc92123abc
第5项结果: abcabc
第6项结果:
*/
</script>
<!--
/abc/g
没什么说的 正则顺序从左到右 a b c
/(abc)*/g
*(0--尽可能多) 第一次匹配(abc)由于有*修饰是贪婪的 所以会选择继续匹配abc 结果 abc abc
/.*abc/g
.*贪婪 尽可能匹配任意多的字符. 所以第一次会匹配到最后一个字符.然后由于后面紧接abc
所以正则引擎会导致回溯把倒数第一个字符让出来匹配abc.由于最后一个字符是c不能匹配a
所以引擎会继续回溯.知道回溯到倒数第三个字符可以匹配abc了.所以结果为abcabc92123abc
/.*?abc/g
.*?惰性的 尽可能少的匹配字符.所以一开始.*?选择不匹配.然后紧接abc去从开头匹配.正好abc可以匹配
引擎就报告匹配成功 所以结果是abc
/.*(abc)*/g
这个跟第三项基本差不多 .*匹配到字符末尾紧接abc回溯 直到倒数第三个 匹配宣布成功 结果就是整个字符串
/.*?(abc)*/g
这个跟第四项差不多 .*?贪婪选择不匹配 然后(abc)*尽可能多的匹配 所以两次abc遇到9宣告失败
/.*?(abc)*?/g
都是惰性 所以都选择不匹配我这解析的挺片面.楼主想要完全理解就要系统的去学习下
其实你这个正则如果有^ $锚点控制情况又不一样了
回溯也是正则最重要的一点 楼主可以去了解下
-->
</body>
</html>
贪婪就是一次吃进所有能匹配的,然后再试图匹配后面的,如果后面不能匹配再回溯。你可以用RegexBuddy之类的工具,对正则匹配进行Debug。这样看得非常清楚。
他所说的应该是贪婪量词,是先吃尽所有字符,然后再一个一个地吐出来,直接匹配成功为止
而懒惰量词,是从头开始一个字符一个字符地吃,直接匹配成功为止我想其意思应该是贫婪是逐渐向前匹配,而懒惰是向后慢慢匹配吧贪婪和懒惰的匹配过程是这样的:懒惰是从左边一个一个地吃直到匹配为止,不加 ? 的是一口吃掉整个字符串,然后从最后一个一个地吐出来直到匹配为止字符串
a=====b=====b===a.*b 将匹配满足条件最长的字符串 a=====b=====b工作方式:
首先将:a=====b=====b=== 全部吃掉,从右边一个一个地吐出来1. a=====b=====b=== 不匹配,吐出一字符
2. a=====b=====b== 不匹配,再吐出一字符
3. a=====b=====b= 不匹配,再吐出一字符
4. a=====b=====b 匹配了,结束。如果再不匹配继续吐,直到没有字符了,匹配失败a.*? 将匹配满足条件最短的字符串 a=====b工作方式:
从左边一个一个地吃掉字符
1. a 不能匹配表达式,继续吃
2. a= 不能匹配表达式,继续吃
3. a== 不能匹配表达式,继续吃
4. a=== 不能匹配表达式,继续吃
5. a==== 不能匹配表达式,继续吃
6. a===== 不能匹配表达式,继续吃
7. a=====b 呵呵,终于能匹配表达式了,匹配结束,匹配位置留于字符 b 后面,继续其他的匹配。如果不能匹配则一个一个地吃掉整个字符串直到吃完为止若还没有匹配则匹配失败。
例:a89a777asaaa
/a.*?a/懒惰,匹配a89a
/a.*a/贪婪,匹配整个字符串.