JavaScript 正则表达式:RegExp 对象方法与字符类详解
本文详细介绍 JavaScript 中 RegExp 对象的构造与核心方法,包括 test、exec、match、search 和 split 的使用场景及区别。深入解析正则表达式的元字符、字符类(简单、负向、范围、组合及预定义类)以及贪婪、惰性和支配性量词的工作原理,通过具体代码示例展示如何在实际开发中进行字符串匹配与替换。
RegExp 对象基础与方法
RegExp 类 RegExp 对象的构造函数可以接受一个或两个参数。第一个参数用于定义需要匹配的模式字符串;若提供第二个参数,则用于指定额外的处理标志(如全局匹配、忽略大小写等)。 一、基础 1.1 使用 RegExp 对象 test() 方法 该方法用于测试字符串是否匹配指定模式。如果给定的字符串匹配该模式,则返回 true,否则返回 false。
代码如下:
var sToMatch = "cat";
var reCat = /cat/; //正则表达式字面量使用Perl风格的语法
alert(reCat.test(sToMatch)); //outs "true"exec()方法
当调用带有字符串参数的 exec() 方法时,它将返回一个数组。数组的第一个元素是第一次匹配的内容,其余元素为反向引用(即捕获组)。注意:如果没有使用捕获组,数组中通常只包含第一个匹配项。
代码如下:
var strAAA = "a bat, a Cat, a fAt baT, a faT cat";
var regAt = new RegExp("at", "gi");
var arr = regAt.exec(strAAA); //arr[0]为"at",arr.index值为3,arr.lastIndex值为5
match() 方法该方法返回一个包含字符串中所有匹配结果的数组。
var strAAA = "a bat, a Cat, a fAt baT, a faT cat";
var regAt = new RegExp("at", "gi");
var arrMatch = strAAA.match(regAt); //注意:字符串.match(参数是匹配字符)跟上面相反
search()方法
search() 方法的作用类似于 indexOf(),但它返回的是字符串中第一次匹配出现的索引位置。其参数必须是一个 RegExp 对象,而不仅仅是子字符串。
代码如下:
var strAAA = "a bat, a Cat, a fAt baT, a faT cat";
var regAt = new RegExp("at", "gi");
var index = strAAA.search(regAt); //outputs "3" 第一次出现位置是31.2 扩展字符串方法
replace() 方法
可以使用第二个参数替换第一个参数匹配的内容,其中第一个参数可以是正则表达式。
var strBBB = "The Sky is red.";
//将上面这句话中的所有s替换,用正则表达式找出所有匹配的
var strNewBBB = strBBB.replace(/s/gi, "##"); //把所有的“s”(不管大小写)都替换成##
此外,replace() 的第二个参数还可以是一个函数。
代码如下:
var sToChange = "The sky is red.";
var reRed = /red/;
var sResultText = sToChange.replace(reRed, function(sMatch) {
return "blue";
});
alert(sResultText);在这个例子中,回调函数中的 sMatch 参数始终为 "red"(因为这是唯一匹配的模式)。"red" 的首次出现被替换为函数的返回值 "blue"。
附加说明:
对于书中提到的“因为这是唯一匹配的模式”,我的理解是:replace 方法仅处理第一个匹配项(除非使用全局标志 g),因此回调函数的参数 sMatch 即为正则表达式匹配到的那个唯一字符串。
split()方法
代码如下:
var sColor = "red,blue,yellow,green";
var reComma = /\,/;
var arrColors = sColor.split(reComma); //split at each comma
alert(arrColors.length); //outputs "4"在正则表达式 reComma 中,逗号前必须添加反斜杠进行转义,因为逗号在正则语法中具有特殊含义。
二、简单模式
元字符与特殊字符
2.1 元字符
正则表达式中使用的所有元字符如下:
( [ { \ ^ $ | ) ? * + .
共计 12 个。在任何需要使用这些元字符时,都需要进行转义,即在前面加上反斜杠。
示例:
var reQMark = /\?/; //转义
var reQMark=new RegExp("\\?"); //这里需要注意,双重转义,因为本身反斜杠也是需要转义
因此,建议后续尽量使用第一种情况,即字面量语法(Perl 风格)。
2.2使用特殊字符
另外,还有一些预定义的特殊字符,如下表所示:
字符 描述
----------------------------------------------------
\t 制表符
\n 换行符
\r 回车符
\f 换页符
\a alert字符
\e escape字符
\cX 与X相对应的控制字符
\b 回退字符
\v 垂直制表符
\0 空字符
----------------------------------------------------
2.3字符类
字符类详解
将一些字符放入方括号中,可以有效地告诉正则表达式去匹配第一个、第二个、第三个字符等。
//①字符类----简单类
var sToMatch = "a bat,a Cat,a fAt baT,a faT cat";
//匹配以bat或cat或fat的正则表达式
var reBatCatFat = /[bcf]at/gi;
//var reBatCatRat=/[\u0062cf]at/gi; 使用Unicode形式
var arrMatches = sToMatch.match(reBatCatRat);
alert(arrMatches.join(",")); //输出"bat,Cat,fAt,baT,faT,cat"
//②字符类----负向类
var sToMatch = "a bat,a Cat,a fAt baT,a faT cat";
//匹配以at结尾,但是不以b或c开头的正则表达式
var reBatCatRat = /[^bc]at/gi; //脱字符^表示不能匹配后面跟着的字符
var arrMatches = sToMatch.match(reBatCatRat);
alert(arrMatches.join(",")); //输出 "fAt,faT"
//③字符类----范围类
//指定从a到z之间的范围:[a-z]. 这里是区分大小写的
var sToMatch = "num1,num2,num3,num4,num5,num6,num7,num8,num9";
var reOneToFour = /num[1-4]/gi; //从1到4
var arrMatches = sToMatch.match(reOneToFour);
alert(arrMatches.join(",")); //输出 "num1,num2,num3,num4"
//④字符类----组合类
组合类 (combination class) 是由几种其他的类组合而成的字符类。
假如要匹配所有的从 a-m 的字母以及从 1-4 的数字,以及一个换行符,那么所用到的类应该是这样:
[a-m1-4\n]
注意在内部的类之间不要有空格。
//⑤字符类----预定义类
代码 等同于 匹配
----------------------------------------------------------------
. [^\n\r] 除了换行和回车之外的任意字符
\d [0-9] 数字
\D [^0-9] 非数字字符
\s [ \t\n\x0B\f\r] 空白字符
\S [^ \t\n\x0B\f\r] 非空白字符
\w [a-zA-Z_0-9] 单词字符(所有的字符、数字和下划线)
\W [^a-zA-Z_0-9] 非单词字符
-----------------------------------------------------------------
使用预定义字符可以明显地使模式匹配变得简单。例如,假设想匹配 3 个数字:
var sToMatch = "567 9838 abc";
var reThreeNums = /[0-9][0-9][0-9]/;
//var reThreeNums=/\d\d\d/; //用预定义比较简洁
alert(reThreeNums.test(sToMatch)); //输出 "true"
量词与匹配策略
2.4 量词
量词 (quantifier) 可以指定某个特定模式出现的次数。当指定某个模式应当出现的次数时,可以指定硬性数量,也可以指定软性数量。
1. 简单量词
--------------------------------------------------------------------
代码 描述
--------------------------------------------------------------------
? 出现零次或一次
* 出现零次或多次(任意次)
+ 出现一次或多次(至少出现一次)
{n} 一定出现n次
{n,m} 至少出现n次但不超过m次
{n,} 至少出现n次
--------------------------------------------------------------------
例如,假设想匹配单词 bread, read 或 red。使用问号量词,则可以只要使用一个表达式就可以匹配这三个:
var reBreadReadOrRed = /b?rea?d/;
或者var reBreadReadOrRed = /b{0,1}rea{0,1}d/;
2. 贪婪的、惰性的和支配性的量词
贪婪量词先看整个的字符串是否匹配。如果没有发现匹配,它去掉该字符串中的最后一个字符,并再次尝试。如果还是没有发现匹配,那么再次去掉最后一个字符,这个过程会一直重复直至到发现一个匹配或者字符串不剩任何字符。
惰性量词先看字符串中的第一个字母是否匹配。如果单独这个字符还不够,就读入下一个字符,组成两个字符的字符串。如果还是没有发现匹配,惰性量词继续从字符串中添加字符直到发现匹配或者整个字符串都检查过也没有匹配。惰性量词和贪婪量词的工作方式恰好相反。
支配量词只尝试匹配整个字符串。如果整个字符串不能产生匹配,不做进一步尝试。支配量词其实简单的说,就是一刀切。
--------------------------------------------------------------------
贪婪 惰性 支配 描述
--------------------------------------------------------------------
? ?? ?+ 零次或一次出现
* *? *+ 零次或多次出现
+ +? ++ 一次或多次出现
{n} {n}? {n}+ 恰好n次出现
{n,m} {n,m}? {n,m}+ 至少n次至多m次出现
{n,} {n,}? {n,}+ 至少n次出现
--------------------------------------------------------------------
看下面例子更好的理解以上三种量词
var str = "abbbaabbbaaabbb1234";
var reg1 = /.*bbb/g;
var reg2 = /.*?bbb/g;
//var reg3 = /.*+bbb/g; //在Visual Studio2008里报错.....
var arrMatches1 = str.match(reg1);
var arrMatches2 = str.match(reg2);
//var arrMatches3 = str.match(reg3);
alert("贪婪的:" + arrMatches1.join(",") + "\n惰性的:" + arrMatches2.join(","));
主要是匹配的一个过程不同!
JavaScript怎么准确判断数据类型:typeof、instanceof与Object.prototype.toString
2026-11-05 17:09:21
JS中将数组和对象混合组装为JSON字符串
2026-11-05 16:41:42
JS运算符优先级与结合性的区别是什么?
2026-11-05 13:22:02
JS Map怎么只遍历Key或Value
2026-11-05 13:00:36
D3.js 与 ECharts 选型对比:灵活性 vs 开发效率
2026-11-05 09:45:01
