<script type="text/javascript">
var someText= "web2.0 .net2.0" ;
var pattern=/(\w+)(\d)[.](\d)/;
var a=pattern.exec(someText);
var a1=pattern.exec(someText);
var b=someText.match(pattern);
var b1=someText.match(pattern);
console.log("exec",a)
console.log(a1)
console.log("match",b)
console.log(b1)
</script>
不加全局g 结果是一样的都是只找到第一个满足条件的字符串就返回
(exec (4) ["web2.0", "web", "2", "0", index: 0, input: "web2.0 .net2.0", groups: undefined]
(4) ["web2.0", "web", "2", "0", index: 0, input: "web2.0 .net2.0", groups: undefined]
match (4) ["web2.0", "web", "2", "0", index: 0, input: "web2.0 .net2.0", groups: undefined]
(4) ["web2.0", "web", "2", "0", index: 0, input: "web2.0 .net2.0", groups: undefined]
结果分析:不加全局结果没区别 都是返回数组 并且数组的第一个是整个正则表达式的匹配结果 后面的依次是子表达式的匹配结果
加了全局g 的结果
<script type="text/javascript">
var someText= "web2.0 .net2.0" ;
var pattern=/(\w+)(\d)[.](\d)/g;
var a=pattern.exec(someText);
var a1=pattern.exec(someText);
var b=someText.match(pattern);
var b1=someText.match(pattern);
console.log("exec",a)
console.log(a1)
console.log("match",b)
console.log(b1)
</script>
exec (4) ["web2.0", "web", "2", "0", index: 0, input: "web2.0 .net2.0", groups: undefined]
(4) ["net2.0", "net", "2", "0", index: 8, input: "web2.0 .net2.0",groups: undefined]
match (2) ["web2.0", "net2.0"]
(2) ["web2.0", "net2.0"]
结果分析:加了全局匹配的g
match中返回的是整个正则表达式的匹配结果 不管执行str.match(reg)多少次 返回的结果都是样的 不返回子正则表达式的结果
exec当加了全局 就等于开启了分步执行的操作 执行一次就返回匹配到详细数据 有子正则表达式返回结果 可以一直执reg.exec(str)最后会返回null,也就是全局匹配完了 返回null 还执行reg.exec(str)又会从头开始匹配结果 重复上一轮的步骤
看下面代码
<script type="text/javascript">
var str = "abc1.net2"
var reg = /\w+(\d)/g
var a = reg.exec(str);
var b = reg.exec(str);
var c = reg.exec(str)
var d = reg.exec(str)
var e = reg.exec(str)
var f = reg.exec(str)
console.log(a);
console.log(b)
console.log(c)
console.log(d)
console.log(e)
console.log(f)
</script>
结果
(2) ["abc1", "1", index: 0, input: "abc1.net2", groups: undefined]
(2) ["net2", "2", index: 5, input: "abc1.net2", groups: undefined]
null
(2) ["abc1", "1", index: 0, input: "abc1.net2", groups: undefined]
(2) ["net2", "2", index: 5, input: "abc1.net2", groups: undefined]
null
总结;match是字符串的的方法 str.match(reg) 当 reg = /…/g 有全局g 不会返回子正则表达式匹配的结果,只返回整个表达式一次匹配的结果
没有g 有子正则表达式的匹配结果
exec是正则表达式的方法 reg.exec(str) 当reg有全局 就开启了全局查找步骤 没执行一次reg.exec(str) 就返回整个正则表达式和子正则表达式匹配的结果
另外正则查找字符串的顺序
当没有全局查找 g
是从左往右查找字符串来匹配正则表达式的开头 然后从字符串的右边开始匹配正则表达式的末尾 当末尾匹配到了就截取这段字符 并返回
当有g
是从左往右查找字符串来匹配正则表达式的开头 然后从字符串的右边开始匹配正则表达式的末尾 当末尾匹配到了就截取这段字符 并返回 然后记录这个末尾字符再整个字符串中的位置lastindex
再从整个字符串lastindex这个位置开始 从左往右匹配整个正则表达式的开头 然后从字符串的右边开始匹配正则表达式的末尾 并返回 一次这样匹配