exec和match你还会混淆吗?

188 阅读2分钟

作为一个前端小白经常容易混淆一些方法,比如exec和match,今天将这两个的方法整理如下:

exec

exec是正则的方法RegExpObject.exec(*string*)用于检索字符串中的正则表达式的匹配,返回值是一个数组,但是此数组的内容和正则对象是否是全局匹配有着很大关系。

  • 没有g修饰符:在非全局匹配模式下,此函数的作用和match()函数是一样的,只能够在字符串中匹配一次,如果没有找到匹配的字符串,那么返回null,否则将返回一个数组,数组的第0个元素存储的是匹配字符串,第1个元素存放的是第一个引用型分组(子表达式)匹配的字符串,第2个元素存放的是第二个引用型分组(子表达式)匹配的字符串,依次类推。同时此数组还包括两个对象属性,index属性声明的是匹配字符串的起始字符在要匹配的完整字符串中的位置,input属性声明的是对要匹配的完整字符串的引用,还有groups目前不被支持,暂不介绍。
let str = "hello world";
let reg = /o/;
let res = reg.exec(str);
console.log(res);  //['o', index: 4, input: 'hello world', groups: undefined]
  • 具有g修饰符:可以通过反复调用exec()函数遍历字符串中的所有匹配,当exec()函数再也找不到匹配的文本时,它将返回null。
let str = "hello world";
let reg = /o/g;
let res1 = reg.exec(str);
let res2 = reg.exec(str);
console.log(res1); // ["o", index: 4, input: "hello world"]
console.log(res2); // ["o", index: 7, input: "hello world"]

通过循环遍历获取全部匹配内容

let str = "hello world";
let reg = /o/g;
let arr=[];
let data;
do {
    data=reg.exec(str);
    if(data) arr.push(data)
} while (data);
console.log(arr)

match

match是字符串的方法str.match(searchvalue),可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。参数为普通字符串的使用方式,此时match方法的返回值是存放首次匹配内容的数组。如果没有找到匹配结果,返回null。

let str="antzone";
console.log(str.match("n")); //["n", index: 1, input: "antzone", groups: undefined]
let str="antzone";
console.log(str.match("蚂蚁")); //null

参数为正则表达式时又分两种情况,如果是非全局匹配,只匹配一次,返回一个数组和参数为字符串时一样。如果是全局匹配,返回一个数组,该数组仅包含匹配到的字符串。如果没有找到匹配结果,返回null。 非全局匹配

let str="How are you";
let reg=/o/;
console.log(str.match(reg));//['o', index: 1, input: 'How are you', groups: undefined]

全局匹配

let str="How are you";
let reg=/o/g;
console.log(str.match(reg)); //['o', 'o']

所以,你会了吗?