JavaScript - 引用类型RegExp
Posted 友人A ㅤ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript - 引用类型RegExp相关的知识,希望对你有一定的参考价值。
ECMAScript通过RegExp类型支持正则表达式。
正则表达式使用类似Perl的简洁语法来创建:
let expression = /pattern/flags;
- pattern(模式) 可以是任何简单或复杂的正则表达式,包括字符类、限定符、分组、向前查找和反向引用。
- flags(标记) 每个正则表达式可以带零个或多个flags,用于控制正则表达式的行为。
标记 | 说明 |
---|---|
g | 全局模式,表示查找字符串的全部内容,而不是找到第一个匹配的内容就结束 |
i | 不区分大小写,表示在查找匹配时忽略pattern和字符串的大小写 |
m | 多行模式,表示查找到一行文本末尾时会继续查找 |
y | 粘附模式,表示只查找从lastIndex开始及之后的字符串 |
u | Unicode模式,启用Unicode匹配 |
s | dotAll模式,表示元字符.匹配任何字符(包括\\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 = /\\d3-\\d2-\\d4/;
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
以上是关于JavaScript - 引用类型RegExp的主要内容,如果未能解决你的问题,请参考以下文章