JavaScript String对象正则匹配方法详解:search、replace、match与split

作者:拾光时间:2026-10-30 05:10:29浏览:273

本文详细解析JavaScript中String对象与正则表达式交互的四个核心方法:search、replace、match和split。重点阐述search的全局忽略特性、replace中特殊字符$的用法及函数回调机制、match在有无全局标志g下的返回差异,以及split利用正则分割字符串的技巧,帮助开发者高效处理字符串模式匹配。

JavaScript正则匹配方法概览

在JavaScript开发中,利用正则表达式进行模式匹配时,String对象与RegExp对象提供了多种便捷方法,如replace、match和search等。以下是对这些常用方法使用场景及特性的总结,供开发者参考。

String对象内置了四种支持正则表达式的方法,分别为:search、replace、match以及split。

search方法:定位与全局忽略

str.search(regexp)

search()方法用于在字符串str中查找与正则表达式regexp匹配的子串,并返回第一个匹配子串首字符的索引位置。若未找到任何匹配项,则返回-1。

例如:


var str = "Javascript";
str.search(/script/); // 返回 script 中s的位置为 4
str.search(/j/i); // 设置正则表达是标识i:忽略大小写,则匹配到J,返回位置0

需要注意的是,search()方法不支持全局搜索。即使正则表达式参数中设置了全局标识g,该方法也会忽略此设置以及regexp的lastIndex属性,始终从字符串起始位置开始检索,因此它仅返回第一个匹配项的位置。

例如:


var str = "javascript is cool";
str.search(/s/g); // 返回 javascript 中的s位置4,不会继续检索s 
str.replace(regexp, replacement)

replace方法:替换策略与特殊字符

replace()方法执行查找并替换操作。它将正则表达式regexp匹配到的子串替换为replacement指定的字符串。若正则表达式包含全局标识g,则替换所有匹配项;否则仅替换第一个匹配项。

replace是字符串操作中极为常用的方法。例如:

1、简单替换


var str = "javascript";
str.replace(/javascript/,'JavaScript'); // 将字符串javascript替换为JavaScript

2、全局替换


// 使用全局表示g进行全局替换
var str = "javascript";
str.replace(/a/g, 'b'); // 将所有的字母a替换为字母b,返回 jbvbscript

3、使用replacement中的特殊字符进行替换。在replacement参数中,$字符具有特殊含义,具体说明如下表格:

来看下例子:


//1、用子表达式替换:$1、$2等
var str = "javascript";
str.replace(/(java)(script)/,'$2$1'); 
// 表达式中()就是一个子表达式,$1对应是第一个表达式的内容,即java,$2为script,所以替换结果为:scriptjava 
//2、$& 为正值表达式匹配的字串
var str = "javascript";
str.replace(/java/,'$&-'); 
// 正则表达式通过直接量java来匹配,匹配结果为java,则 $&的值为java,然后用字符串$&-来替换匹配的字串,结果为java-script
// 3、 $` $' $$
var str = "javascript";
str.replace(/ava/,"$`"); // $`为匹配子串ava的左侧文本,则为j,则替换后ava的结果为:jjscript
str.replace(/ava/,"$'"); // $'为匹配子串ava的右侧文本,则为script,则替换ava的结果为:jscriptscript
str.replace(/ava/,"$$"); // $$为直接量符号,即插入一个$符号,替换结果为:j$script

4、使用replacement作为函数进行替换

replace方法的replacement参数可以是函数而非字符串。每个匹配项都会调用该函数,函数返回的字符串将作为替换文本。该函数的第一个参数是完整的匹配模式字符串,后续参数是与正则表达式中子表达式匹配的字符串(可有0个或多个)。随后是一个整数参数,声明匹配在str中出现的位置。最后一个参数是str自身。

来看个例子:


// match 为匹配整个字符串,即:'abc12345#$*%'
// p1 为第一个子表达式,([^\d]*),匹配0个或多个非数字的字符,即:abc
// p2 为第二个子表达式,(\d*),匹配0个或多个的数字,即:12345
// p3 为第三个子表达式,([^\w]*),匹配0个或匹配任何非单词字符。等价于 '[^A-Za-z0-9_]',即 #$*%
// offset 为模式匹配出现的位置,从第一个字符已经匹配成功,则位置为0
// string为字符串本身,即 abc12345#$*%
function replacer(match, p1, p2, p3, offset, string) {
return [p1, p2, p3].join(' - ');
}
var newString = 'abc12345#$*%'.replace(/([^\d]*)(\d*)([^\w]*)/, replacer); 
// 替换结果为:abc - 12345 - #$*%

match方法:全局与非全局匹配差异

str.match(regexp)

match()方法是String对象中最常用的正则表达式方法之一。它接收一个正则表达式或通过RegExp()构造函数创建的正则表达式作为唯一参数,返回值是一个包含匹配结果的数组。

match()方法的行为取决于正则表达式是否设置了全局标志g,通常分为两种情况:有全局标志g和无全局标志g。

1、有设置全局标志

如果设置了全局标志g,返回的数组将包含字符串中所有匹配的结果。例如:


// 全局匹配
var str = "1 plus 2 equals 3";
str.match(/\d/g); // 匹配字符串中出现的所有数字,并返回一个数组: [1,2,3]

2、没有设置全局标志

若未设置全局标志,则仅检索第一个匹配项。此时match()方法仍返回一个数组,数组的第一个元素是匹配的字符串,后续元素则是正则表达式中用括号括起来的子表达式匹配结果。来看个例子:


// 非全局匹配
var str = "visit my blog at http://www.example.com";
str.match(/(\w+):\/\/([\w.]+)\/); // 返回结果:["http://www.example.com", "http", "www.example.com"]
// 正则表达式匹配的结果为:http://www.example.com
// 第一个子表达式 (\w+)匹配结果:http
// 第二个子表达式 ([\w.])匹配结果: www.example.com

split方法:基于正则的字符串分割

str.split(delimiter, limit)

split()方法利用指定的分隔符将调用该方法的字符串分解为一个字符串数组。

参数:

delimiter:字符串或正则表达式,指定分割字符串的位置。

limit:指定返回数组的最大长度。若未设置此参数,则分割整个字符串。

例如:


//1、 只传一个参数,默认分割整个字符串
var str ="a,b,c,d,e";
str.split(','); // 返回分割的字符串数组:["a", "b", "c", "d", "e"]
//2、传入两个参数
var str ="a,b,c,d,e";
str.split(',',3); //指定限定长度,则返回对应的数组:["a", "b", "c"]
//3、使用正则表达式匹配,不包含分割字符串
var str = "aa44bb55cc66dd";
str.split(/\d+/); //通过匹配数字进行分割字符串,但不包含分割的字符串,则返回的结果为:["aa","bb","cc","dd"];
//4、使用正则表达式匹配,包含分割字符串
var str = "aa44bb55cc66dd";
str.split(/(\d+)/); //通过匹配数字进行分割字符串,且分割的字符串是包含在子表达式中,则返回的结果为:["aa", "44", "bb", "55", "cc", "66", "dd"]

关于正则表达式模式匹配的String方法相关知识,小编就给大家介绍到这里。

作者最新文章