RegExp对象

在 ECMAScript 中,通过 RegExp 对象使用正则表达式。

正则表达式是构成搜索模式的字符序列,可以用于文本搜索或替换等操作。虽然 ECMAScript 中的 RegExp 对象可以使用正则表达式,但是正则表达式本身并不属于 ECMAScript,因此本节不介绍正则表达式,对正则表达式不熟悉的读者可以在百度网站搜索相关资料。

创建RegExp对象

在 ECMAScript 中,通过 RegExp 对象使用正则表达式。

正则表达式是构成搜索模式的字符序列,可以用于文本搜索或替换等操作。虽然 ECMAScript 中的 RegExp 对象可以使用正则表达式,但是正则表达式本身并不属于 ECMAScript,因此本节不介绍正则表达式,对正则表达式不熟悉的读者可以在百度网站搜索相关资料。

创建RegExp对象

RegExp 对象有两种创建形式:第一种为字面量形式,第二种为构造函数形式。它们并没有实质区别,只是写法不同,创建 RegExp 对象时可以任选一种。

let 对象名称 = /正则表达式/匹配设置;
let 对象名称 = new RegExp("正则表达式","匹配设置");

其中,正则表达式是必选参数,匹配设置是可选参数。常用的匹配设置如表16-5所示。

image 2024 02 19 19 56 31 110
Figure 1. 表16-5 常用的匹配设置

创建 RegExp 对象的示例代码如下。

//省略匹配设置
let regex1a = /hello/;
let regex1b = new RegExp("hello");
//使用1个匹配设置
let regex2a = /hello/i;
let regex2b = new RegExp("hello","i");
//使用多个匹配设置
let regex3a = /hello/im;
let regex3b = new RegExp("hello","im");

注意,在正则表达式中有一些元字符,例如,“\w” 表示匹配任意英文字母,“\d” 表示匹配任意数字。在使用字面量形式创建 RegExp 对象时,元字符可以直接写作 “\w” 或 “\d”,但使用构造函数创建 RegExp 对象时,因为此时传入的正则表达式是字符串类型,所以在某些情况下必须再次转义(例如,“\” 符号需要写成 “\\”,详见3.4节)。

例如,以下代码虽然创建了相同的 RegExp 对象,但在写法上存在区别。

let regex1a = /\w\d/;
let regex1b = new RegExp("\\w\\d");

在字符串的方法中传入RegExp对象

在 ECMAScript 中,字符串具有对传入的 RegExp 对象进行操作的方法,它们分别为 search()、replace()、split() 和 match()。

search() 方法用于搜索字符串中与正则表达式匹配的文本,然后返回首个匹配的索引位置。示例代码如下。

let str = "Hello world!";
let matchIndex = str.search(/WORLD/i);
console.log(matchIndex); //输出6

replace() 方法用于将字符串中与正则表达式匹配的文本替换为其他文本,返回值为替换后的新字符串,注意,在非全局模式下,只替换首个匹配文本,而在全局模式下,替换所有匹配文本。示例代码如下。

let str = "Hello SOMEONE! Goodbye Someone!";
let newStr1 = str.replace(/someone/i, "Nick");
//由于匹配设置不是全局模式,因此只替换首个匹配文本
//以下代码输出"Hello Nick! Goodbye Someone!"
console.log(newStr1);

let newStr2 = str.replace(/someone/ig, "Nick");
//在全局模式下,将替换所有匹配文本
//以下代码输出"Hello Nick! Goodbye Nick!"
console.log(newStr2);

split() 方法用于将字符串按与正则表达式匹配的情况进行拆分,返回值为拆分后的字符串数组。示例代码如下。

let str = "watches, feet, photos, boxes, children, stories, men, cities";
//将字符串拆分为单个逗号及单个空格的组合
let regex = /, /;
//以下代码输出['watches', 'feet', 'photos', 'boxes', 'children', 'stories', 'men', 'cities']
console.log(str.split(regex));

match() 方法用于查找字符串中与正则表达式匹配的文本,并返回该文本。注意,不同模式下 match() 方法的返回值不同,非全局模式将以对象的形式返回首个匹配文本,而全局模式将以数组的形式返回全部匹配文本。示例代码如下。

let str = "watches, feet, photos, boxes, children, stories, men, cities";
//非全局模式,查找以es结尾的单词
let regex1 = /\w+es/
//以下代码输出对象['watches', index: 0, input: 'watches, feet, photos, boxes,
//children, stories, men, cities', groups: undefined]
console.log(str.match(regex1));
//使用toString()方法将对象转换为字符串,以下代码输出字符串"watches"
console.log(str.match(regex1).toString());

//全局模式,查找以es结尾的单词
let regex2 = /\w+es/g
//以下代码输出数组['watches', 'boxes', 'stories', 'cities']
console.log(str.match(regex2).toString());

直接使用RegExp对象

除在字符串的方法中传入 RegExp 对象之外,你还可以直接使用 RegExp 对象的方法对指定字符串进行验证或查找,它们分别为 test() 方法和 exec() 方法。

test() 方法用于验证传入的字符串中是否存在与正则表达式相匹配的文本。如果存在,则输出 true;否则;输出 false。示例代码如下。

let regex = /World/i;
console.log(regex.test("Hello world!")); //输出true
console.log(regex.test("Hello guys!"));  //输出false

exec() 方法用于查找传入的字符串中与正则表达式匹配的文本,并返回该文本。在非全局模式下,它与字符串的 match() 方法的返回值一致,都以对象形式返回首个匹配文本,但在全局模式下,match() 方法返回字符串数组,而 exec() 方法可以多次执行,每次都会以对象形式返回下一个匹配文本。示例代码如下。

let str = "watches, feet, photos, boxes, children, stories, men, cities";
//在非全局模式下,查找以es结尾的单词
let regex1 = /\w+es/;
let result1 = regex1.exec(str);
//以下代码输出"watches (index:0)"
console.log(`${result1.toString()} (index:${result1.index})`);

//在全局模式下,查找以es结尾的单词
let regex2 = /\w+es/g;
let result2;
//循环执行regex2.exec(str),直到返回null
while ((result2 = regex2.exec(str)) != null) {
    console.log(`${result2.toString()} (index:${result2.index})`);
    //循环执行4次,分别输出以下结果
    //watches (index:0)
    //boxes (index:23)
    //stories (index:40)
    //cities (index:54)
}