JavaScript - 引用类型RegExp

ECMAScript通过RegExp类型支持正则表达式。


正则表达式使用类似Perl的简洁语法来创建:

let expression = /pattern/flags;
  • pattern(模式) 可以是任何简单或复杂的正则表达式,包括字符类、限定符、分组、向前查找和反向引用。
  • flags(标记) 每个正则表达式可以带零个或多个flags,用于控制正则表达式的行为。
标记说明
g全局模式,表示查找字符串的全部内容,而不是找到第一个匹配的内容就结束
i不区分大小写,表示在查找匹配时忽略pattern和字符串的大小写
m多行模式,表示查找到一行文本末尾时会继续查找
y粘附模式,表示只查找从lastIndex开始及之后的字符串
uUnicode模式,启用Unicode匹配
sdotAll模式,表示元字符.匹配任何字符(包括\n或\r)
// 匹配字符串中所有的 at
let pattern1 = /at/g;

// 匹配第一个 bat 或 cat,忽略大小写
let pattern2 = /[bc]at/i;

// 匹配所有以 at 结尾的三字符组合,忽略大小写
let pattern3 = /.at/gi;

所有元字符在模式中必须转义,包括:
( [ { \ ^ $ | ) ] } ? * + .

// 匹配第一个 bat 或 cat,忽略大小写
let pattern1 = /[bc]at/i;
// 匹配第一个 [bc]at,忽略大小写
let pattern2 = /\[bc\]at/i;

// 匹配所有以 at 结尾的三字符组合,忽略大小写
let pattern3 = /.at/gi;
// 匹配所有 .at,忽略大小写
let pattern4 = /\.at/gi;

使用RegExp构造函数来创建正则函数,它接收两个参数:模式字符串和(可选的)标记字符串

// 匹配第一个 bat 或 cat,忽略大小写
let pattern1 = /[bc]at/i;

// 使用RegExp构造函数创建正则函数
let pattern2 = new RegExp("[bc]at", "i");

注意:

  • RegExp构造函数的两个参数都是字符串
  • 因为RegExp的模式参数是字符串,所以在某些情况下需要二次转义
  • 所有元字符都必须二次转义,包括转义字符序列
    如\n( \ 转义后的字符串是 \\,在正则表达式字符串中则要写成 \\\\ )

使用RegExp也可以基于已有的正则表达式实例,并可选择性地修改它们的标记。

const re1 = /cat/g;
console.log(re1); // /cat/g

const re2 = new RegExp(re1);
console.log(re2); // /cat/g

const re3 = new RegExp(re1, "i");
console.log(re3); // /cat/i

RegExp实例方法

exec()方法:主要用于配合捕获组使用

  • 这个方法只接收一个参数,即要应用模式的字符串
  • 如果找到了匹配项,则返回包含第一个匹配信息的数组
  • 如果没找到匹配项,则返回null
  • 返回的数组虽然是Array的实例,但包含两个额外的属性:index和input
    • index是字符串中匹配模式的起始位置
    • input是要查找的字符串
  • 这个数组的第一个元素是匹配整个模式的字符串,其他元素是与表达式中的捕获组匹配的字符串
  • 如果模式中没有捕获组,则数组只包含一个元素
let text = 'aaa and bbb and ccc';
let pattern = /aaa(and bbb(and ccc)? )? /gi;
let matches = pattern.exec(text);

// 整个字符串匹配模式,所以matchs数组的index属性就是0
console.log(matches.index); // 0
console.log(matches.input); // aaa and bbb and ccc
// 数组的第一个元素是匹配的整个字符串
console.log(matches[0]); // aaa and bbb and ccc
// 第二个元素是匹配第一个捕获组的字符串
console.log(matches[1]); // and bbb and ccc
// 第三个元素是匹配第二个捕获组的字符串
console.log(matches[2]); // and ccc

如果模式设置了全局标记,则每次调用exec()方法会返回一个匹配的信息。如果没有设置全局标记,则无论对同一个字符串调用多少次exec(),也只会返回第一个匹配的信息。

  • 模式没有设置全局标记,因此调用exec()只返回第一个匹配项 cat:
let text = 'cat, bat, sat, fat';
let pattern = /.at/;
let matches = pattern.exec(text);

console.log(matches.index); // 0
console.log(matches[0]); // cat
console.log(pattern.lastIndex); // 0

matches = pattern.exec(text);
console.log(matches.index); // 0
console.log(matches[0]); // cat
console.log(pattern.lastIndex); // 0
  • 在这个模式上设置了g标记,则每次调用exec()都会在字符串中向前搜索下一个匹配项
let text = 'cat, bat, sat, fat';
// 设置全局标记
let pattern = /.at/g;
let matches = pattern.exec(text);

// 每次调用exec()都会返回字符串中的下一个匹配项,直到搜索到字符串末尾
console.log(matches.index); // 0
console.log(matches[0]); // cat
console.log(pattern.lastIndex); // 3

matches = pattern.exec(text);
console.log(matches.index); // 5
console.log(matches[0]); // bat
// 模式的lastIndex属性每次都会变化.每次调用exec()都会更新lastIndex值,以反映上次匹配的最后一个字符的索引
console.log(pattern.lastIndex); // 8

matches = pattern.exec(text);
console.log(matches.index); // 10
console.log(matches[0]); // sat
console.log(pattern.lastIndex); // 13
  • 如果模式设置了粘附标记y,则每次调用exec()就只会在lastIndex的位置上寻找匹配项。粘附标记覆盖全局标记。
let text = 'cat, bat, sat, fat';
// 设置全局标记
let pattern = /.at/y;
let matches = pattern.exec(text);

console.log(matches.index); // 0
console.log(matches[0]); // cat
console.log(pattern.lastIndex); // 3

matches = pattern.exec(text);
// 以索引3对应的字符开头找不到匹配项,因此exec()返回null
console.log(matches); // null
// exec() 没有找到匹配项,于是将lastIndex置为0
console.log(pattern.lastIndex); // 0

// 向前设置lastIndex可以让黏附模式通过exec()找到下一个匹配项
pattern.lastIndex = 5;
matches = pattern.exec(text);
console.log(matches.index); // 5
console.log(matches[0]); // bat
console.log(pattern.lastIndex); // 8


text()方法:如果输入的文本与模式匹配,则参数返回true,否则返回false。接收一个字符串参数。

适用于只想测试模式是否匹配,而不需要实际匹配内容的情况。

test()经常用在if语句中。

let text = "000-00-0000";
// 正则表达式用于测试特定的数值序列
let pattern = /\d{3}-\d{2}-\d{4}/;

if (pattern.test(text)) {
    console.log(111); // 111
}


toLocaleString()toString():都返回正则表达式的字面量表示

let pattern = new RegExp('\\[bc\\]at', 'gi');

console.log(pattern.toString()); // /\[bc\]at/gi
console.log(pattern.toLocaleString()); // /\[bc\]at/gi

RegExp构造函数属性

全名简写说明
input$_最后搜索的字符串
lastMatch$&最后匹配的文本
lastParen$+最后匹配的捕获组
leftContext$`input字符串出现在lastMatch前面的文本
rightContext$’input字符串出现在lastMatch后面的文本
let text = "aaa abb acc add";
let pattern = /(.)bb/g;

if (pattern.test(text)) {
    console.log(RegExp.input); // aaa abb acc add
    console.log(RegExp.leftContext); // aaa
    console.log(RegExp.rightContext); //  acc add
    console.log(RegExp.lastMatch); // abb
    console.log(RegExp.lastParen); // a
}

这些属性名也可以替换成简写形式,只不过要使用中括号语法来访问

let text = "aaa abb acc add";
let pattern = /(.)bb/g;

if (pattern.test(text)) {
    console.log(RegExp.$_); // aaa abb acc add
    console.log(RegExp['$`']); // aaa
    console.log(RegExp["$'"]); //  acc add
    console.log(RegExp['$&']); // abb
    console.log(RegExp['$+']); // a
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值