87,926
社区成员
发帖
与我相关
我的任务
分享
/abc/g 匹配 abc
/(abc)*/g 匹配 abcabc 贪婪
/.*abc/g 匹配 abcabc92123abc 贪婪
/.*?abc/g 匹配 abc, 92123abc 惰性
/.*(abc)*/g 匹配 abcabc92123abc 贪婪
/.*?(abc)*/g 匹配 abcabc 前惰性后贪婪
/.*?(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>
/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 运行结果 ,
<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>