本文详细解析JavaScript中正则表达式的四个核心方法:test、exec、match和replace。重点对比全局修饰符g对exec和match返回值结构的影响,以及replace中replacement参数支持字符串与函数的两种替换模式,帮助开发者准确掌握正则匹配与替换的高级用法。
正则表达式(regular expression)用于定义字符串匹配模式,主要功能包括检测字符串是否包含特定子串、替换匹配到的子串,或从字符串中提取符合特定条件的子串。
由于正则表达式使用频率相对较低,其具体用法容易遗忘。本文梳理了常用的正则相关函数及其功能,以便后续查阅。
RegExp对象的test与exec方法
RegExp对象主要提供两个常用函数。
1、test函数
语法:RegExpObject.test(string)
返回值:若字符串string中包含与RegExpObject匹配的子串,则返回true;否则返回false。
说明:该方法无特殊行为,对修饰符g不做特殊处理。
示例:
var url = 'http://www.baidu.com?a=1&b=2&c=3';
var reg = /a=1/;
console.log(reg.test(url)); // 输出结果为 true
2、exec函数
语法:RegExpObject.exec(string)
返回值:返回一个包含匹配结果的数组;若未找到匹配,则返回null。
说明:
exec()是一个功能强大且通用的方法,其使用复杂度高于test()及支持正则的String对象方法。
当exec()找到匹配文本时,返回一个结果数组。该数组的第0个元素为与正则表达式匹配的文本;第1个元素为与第1个子表达式匹配的文(若有);第2个元素为与第2个子表达式匹配的文(若有),依此类推。除数组元素和length属性外,exec()还返回两个属性:index属性表示匹配文本在字符串中的起始字符位置;input属性存储被检索的原始字符串。调用非全局RegExp对象的exec()方法时,返回的数组与String.match()返回的数组相同。
当RegExpObject为全局正则表达式(带修饰符g)时,exec()的行为更为复杂。它从RegExpObject的lastIndex属性指定的字符位置开始检索字符串string。找到匹配文本后,exec()会将lastIndex设置为匹配文本最后一个字符的下一个位置。因此,可通过反复调用exec()来遍历字符串中的所有匹配文本。当exec()无法再找到匹配文本时,返回null,并将lastIndex重置为0。
示例:
正则表达式带修饰符g
var url = 'http://www.baidu.com?a=1&b=2&c=3';
var reg = /([^?&=]+)=([^?&=])*/g;
console.log(reg.exec(url)); //["a=1", "a", "1", index: 21, input: "http://www.baidu.com?a=1&b=2&c=3"]
console.log(reg.exec(url)); //["b=2", "b", "2", index: 25, input: "http://www.baidu.com?a=1&b=2&c=3"]
console.log(reg.exec(url)); //["c=3", "c", "3", index: 29, input: "http://www.baidu.com?a=1&b=2&c=3"]
console.log(reg.exec(url)); //null
reg.lastIndex = 0; //这段代码很重要哦,注意理解
console.log(reg.exec(url)); //["a=1", "a", "1", index: 21, input: http://www.baidu.com?a=1&b=2&c=3]
正则表达式不带修饰符g
var url = 'http://www.baidu.com?a=1&b=2&c=3';
var reg = /([^?&=]+)=([^?&=])*/g;
console.log(reg.exec(url)); //["a=1", "a", "1", index: 21, input: "http://www.baidu.com?a=1&b=2&c=3"]
console.log(reg.exec(url)); //["a=1", "a", "1", index: 21, input: "http://www.baidu.com?a=1&b=2&c=3"]
console.log(reg.exec(url)); //["a=1", "a", "1", index: 21, input: "http://www.baidu.com?a=1&b=2&c=3"]
console.log(reg.exec(url)); //["a=1", "a", "1", index: 21, input: "http://www.baidu.com?a=1&b=2&c=3"]
reg.lastIndex = 0;
console.log(reg.exec(url)); //["a=1", "a", "1", index: 21, input: http://www.baidu.com?a=1&b=2&c=3]
注意两者的区别,仔细阅读函数描述即可理解。
String对象的match与replace方法
String对象支持正则的方法有4个,此处仅介绍其中2个。
1、match函数
语法:stringObject.match(searchvalue | regexp),此处仅讨论regexp模式。
返回值:存放匹配结果的数组。数组内容取决于regexp是否带有全局标志g。
说明:
match()方法在字符串stringObject中查找一个或多个与regexp匹配的文。其行为在很大程度上依赖于regexp是否包含标志g。
若regexp没有标志g,match()仅在stringObject中执行一次匹配。若未找到匹配文本,返回null;否则返回一个数组,第0个元素为匹配文本,其余元素为与子表达式匹配的文。除常规数组元素外,返回的数组还包含两个对象属性:index属性表示匹配文本在stringObject中的起始字符位置;input属性引用原始字符串stringObject。
若regexp具有标志g,match()执行全局检索,查找stringObject中所有匹配子串。若未找到任何匹配子串,返回null;若找到,则返回一个数组。全局匹配返回的数组内容与前者不同,其元素仅包含所有匹配子串,且不包含index或input属性。
示例:
不带修饰符g
var url = 'http://www.baidu.com?a=1&b=2&c=3';
var reg = /([^?&=]+)=([^?&=])*/;
var result = url.match(reg);
console.log(result); //["a=1", "a", "1", index: 21, input: "http://www.baidu.com?a=1&b=2&c=3"]
console.log(result.index); //21
console.log(result.input); //http://www.baidu.com?a=1&b=2&c=3
带修饰符g
var url = 'http://www.baidu.com?a=1&b=2&c=3';
var reg = /([^?&=]+)=([^?&=])*/g;
var result = url.match(reg);
console.log(result); //["a=1", "b=2", "c=3"]
console.log(result.index); //undefined
console.log(result.input); //undefined
注意两者的区别,仔细阅读函数描述即可理解。
2、replace函数
语法:stringObject.replace(regexp/substr,replacement)
返回值:返回一个新字符串,该字符串是用replacement替换了regexp的第一次匹配或所有匹配后得到的结果。
说明:字符串stringObject的replace()方法执行查找并替换操作。它在stringObject中查找与regexp匹配的子串,并用replacement替换这些子串。若regexp具有全局标志g,则替换所有匹配子串;否则仅替换第一个匹配子串。
replacement可以是字符串或函数。若为字符串,每个匹配都将由该字符串替换。但replacement中的$字符具有特定含义,具体规则如下表所示,表示从模式匹配得到的字符串将用于替换。
| 字符 | 替换文本 |
|---|---|
| $1、$2、...、$99 | 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。 |
| $& | 与 regexp 相匹配的子串。 |
| $` | 位于匹配子串左侧的文本。 |
| $' | 位于匹配子串右侧的文本。 |
| $$ | 直接量符号。(意思就是要替换为 $ 符号的时候,就写两个$) |
示例:
不带修饰符g
var url = 'http://www.baidu.com?a=1&b=2&c=3';
var reg = /([^?&=]+)=([^?&=])*/;
var url1 = url.replace(reg,function(a,b,c,d,e){
console.log(a,b,c,d,e); //a=1, a, 1, 21, http://www.baidu.com?a=1&b=2&c=3
return 'ok';
})
console.log(url1); //http://www.baidu.com?ok&b=2&c=3
带修饰符g
var url = 'http://www.baidu.com?a=1&b=2&c=3';
var reg = /([^?&=]+)=([^?&=])*/g;
var url1 = url.replace(reg,function(a,b,c,d,e){
console.log(a,b,c,d,e); //执行3次,分别输出为:a=1, a, 1, 21, http://www.baidu.com?a=1&b=2&c=3 和 b=2, b, 2, 25, http://www.baidu.com?a=1&b=2&c=3 和 | c=3, c, 3, 29, http://www.baidu.com?a=1&b=2&c=3
return 'ok';
})
console.log(url1); //http://www.baidu.com?ok&ok&ok
第二个参数为字符串时
var url = 'http://www.baidu.com?a=1&b=2&c=3';
var reg = /([^?&=]+)=([^?&=])*/; //不带修饰符g
var url1 = url.replace(reg,"$&")
console.log(url1); //http://www.baidu.com?a=1&b=2&c=3
var url1 = url.replace(reg,"$1")
console.log(url1); //http://www.baidu.com?a&b=2&c=3
var url1 = url.replace(reg,"$2")
console.log(url1); //http://www.baidu.com?1&b=2&c=3
var url1 = url.replace(reg,"$'")
console.log(url1); //http://www.baidu.com?&b=2&c=3&b=2&c=3
var reg = /([^?&=]+)=([^?&=])*/g; //带修饰符g
var url1 = url.replace(reg,"$&")
console.log(url1); //http://www.baidu.com?a=1&b=2&c=3
var url1 = url.replace(reg,"$1")
console.log(url1); //http://www.baidu.com?a&b&c
var url1 = url.replace(reg,"$2")
console.log(url1); //http://www.baidu.com?1&2&3
var url1 = url.replace(reg,"$'")
console.log(url1); //http://www.baidu.com?&b=2&c=3&&c=3&
以上介绍了JS中match、replace、exec等函数的全面解析,希望对读者有所帮助。如有疑问请留言,小编会及时回复。感谢支持。