semi-xi / blog

blog
4 stars 1 forks source link

匹配字符串之exec与match #34

Open semi-xi opened 3 years ago

semi-xi commented 3 years ago

调用方式

两者调用方式是不一样的,一个是字符串调用,一个是正则表达式调用 string.match(regexp) regexp.exec(string);

返回

两者都是返回数组,

正则表达式没有分组

如果执行exec的时候没有分组(即没有用括号括住表达式的一部分),如果有匹配的时候,数组的唯一值就是这个匹配的第一个串,如果没有则返回null

var str= "cat,hat" ;
var p=/at/; //没有g属性
alert(p.exec(str))
alert(str.match(p))

都是"at"。在这种场合下exec等价于match。

但是当正则表达式增加了全局匹配属性(g),那样就会有差异

var str= "cat,hat" ;
var p=/at/g; //注意g属性
alert(p.exec(str))
alert(str.match(p))

分别是
"at"
"at,at"。

exec永远只会返回第一个匹配,而match设置了g属性的时候,会返回所有

正则表达式有分组

exec如果找到了匹配,并且包含分组的话返回的数组将会包含多个元素,第一个是匹配的元素,之后的话都是分组的元素

如下的代码将弹出"cat2,at":

var str= "cat2,hat8" ;
var p=/c(at)\d/;
alert(p.exec(str))

其中第一个元素是匹配的字符串"cat2",之后的元素是括号中匹配的"at"。

特殊情况

match函数在满足如下条件下将越俎代庖,实现和exec一样的功能

  1. 正则表达式中含有分组(括号)
  2. 返回唯一的匹配
var str= "cat2,hat8" ;
var p=/c(at)\d/;
alert(p.exec(str))
alert(str.match(p))

参考

彻底领悟javascript中的exec与match方法