正则表达式:规定了字符串中字符出现规律的表达式
正则表达式的 pattern(模式)可以是任何简单或复杂的正则表达式,包括字符类、限定符、 分组、向前查找和反向引用。每个正则表达式可以带零个或多个 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;
这里的 pattern1 匹配”bat”或”cat”,不区分大小写。要直接匹配”[bc]at”,左右中括号都必 须像 pattern2 中那样使用反斜杠转义。在 pattern3 中,点号表示”at”前面的任意字符都可以匹配。 如果想匹配”.at”,那么要像 pattern4 中那样对点号进行转义。
11.1 创建 RegExp 对象的语法
//var 变量 = new RegExp("正则表达式","匹配模式")
let search = new Regexp(/a/,"g"); //g表示全局搜索,此为全局搜索带a的字符串
11.2 使用字面量创建正则表达式
//let 变量 = /正则表达式/匹配模式
let search = /a/g //g表示全局搜索
let srt = "helLw word"
let reg = /l/ig // i 忽略大小写 g 全局替换
console.log(srt.replace(reg,"*")); // "he**w word"
//将检索到的“l”和“L”全部都换成“*”
11.3 test()
检测正则表达式是否匹配字符串的一部分,返回布尔值(Boolean)
如果输入的文本与模式匹配,则参数 返回 true,否则返回 false。这个方法适用于只想测试模式是否匹配,而不需要实际匹配内容的情况。
reg.test(str);
let reg = /abc/;
let str = "adcbf",
otherStr = "acabcf";
console.log(reg.test(str)); //false 字符串中没有"abc"
console.log(reg.test(otherStr))//true
test()经常用在 if 语句中:
let text = "000-00-0000";
let pattern = /\d{3}-\d{2}-\d{4}/;
if (pattern.test(text)) {
console.log("The pattern was matched.");
}
- 在这个例子中,正则表达式用于测试特定的数值序列。
- 如果输入的文本与模式匹配,则显示匹配成 功的消息。
- 这个用法常用于验证用户输入,此时我们只在乎输入是否有效,不关心为什么无效。
无论正则表达式是怎么创建的,继承的方法 toLocaleString()和 toString()都返回正则表达 式的字面量表示。比如:
let pattern = new RegExp("\\[bc\\]at", "gi");
console.log(pattern.toString()); // /\[bc\]at/gi
console.log(pattern.toLocaleString()); // /\[bc\]at/gi
这里的模式是通过 RegExp 构造函数创建的,但 toLocaleString()和 toString()返回的都是其
字面量的形式。
注意 正则表达式的 valueOf()方法返回正则表达式本身。
11.4 exec()方法
exec()主要用于配合捕获组使用。这个方法只接收一个参数,即要应用模式的字符串。如果找到了匹配项,则返回包含第一个匹配信息的数组;如果没找到匹配项,则返回null。返回的数组虽然是 Array 的实例,但包含两个额外的属性:index 和 input。index 是字符串中匹配模式的起始位置,input 是要查找的字符串。这个数组的第一个元素是匹配整个模式的字符串,其他元素是与表达式中的捕获组匹配的字符串。如果模式中没有捕获组,则数组只包含一个元素。
let text = "mom and dad and baby";
let pattern = /mom( and dad( and baby)?)?/gi;
let matches = pattern.exec(text);
console.log(matches.index); // 0
console.log(matches.input); // "mom and dad and baby"
console.log(matches[0]); // "mom and dad and baby" 返回数组内第一个匹配信息
console.log(matches[1]); // " and dad and baby"
console.log(matches[2]); // " and baby"
在上面的正则表达式里,通过两层()来进行检索,
- 使用正则后调用 exec()后找到了一个匹配项。
- 因为整个字符串匹配模式,所以 matchs数组的 index 属性就是 0。
- 数组的第一个元素是匹配的整个字符串,
- 第二个元素是匹配第一个捕获组的字符串,
- 第三个元素是匹配第二个捕获组的字符串。