JavaScript通过RegExp使用正则表达式过程详解
作者:包小志
RegExp
ECMAScript通过RegExp类型支持正则表达式。正则表达式使用类似Perl的简洁语法来创建:
let expression = /pattern/flags;
这个正则表达式的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;
与其他语言中的正则表达式类似,所有元字符在模式中也必须转义,包括:
( [ { \ ^ $ | ) ] } ? * + .
元字符在正则表达式中都有一种或多种特殊功能,所以要匹配上面这些字符本身,就必须使用反斜杠来转义。下面是几个例子:
//匹配第一个“bat”或“cat”,忽略大小写 let pattern1 = /[bc]at/i; //匹配第一个"[bc]at",忽略大小写 let pattern2 = /\[bc\]at/i; //匹配所有以“at”结尾的三字符组合,忽略大小写 let pattern3 = /.at/gi; //匹配所有".at",忽略大小写 let pattern4 = /\.at/gi
这里的pattern1匹配”bat“或”cat“,不区分大小写。要直接匹配“[bc]at",左右中括号都必须像pattern2中那样使用反斜杠转义。
在pattern3中,点号表示"at"前面的任意字符都可以匹配。如果想匹配".at",那么要像pattern4中那样对点号进行转义。
前面例子中的正则表达式都是使用字面量形式定义的。正则表达式也可以使用RegExp构造函数来创建,它接收两个参数:模式字符串 和 (可选的)标记字符串。任何使用字面量定义的正则表达式也可以通过构造函数来创建,比如:
//匹配第一个“bat”或“cat”,忽略大小写 let pattern1 = /[bc]at/i; //跟pattern1一样,只不过是用构造函数创建的 let pattern2 = new RegExp("[bc]at","i");
这里的pattern1和pattern2是等效的正则表达式。注意,RegExp构造函数的两个参数都是字符串。因为RegExp的模式参数是字符串,所以在某些情况下需要二次转义。所有元字符都必须二次转义,包括转义字符序列,如\n (\转义后的字符串是\,在正则表达式字符串中则要写成\ \ \ \
字面量模式 | 对应的字符串 |
---|---|
/ \ [bc \ ]at/ | “\ \ [bc \ \ ]at” |
/ \ .at/ | “\ \ .at” |
/name \ /age/ | “name\ /age” |
/ \d.\d{1,2}/ | “\ \d.\ \d{1,2}” |
/ \ w\ \hello \ \123/ | “\ \w \ \ \ \hello\ \ \ \123” |
此外,使用RegExp也可以基于已有的正则表达式实例,并可选择性地修改它们的标记:
const rel = /cat/g; console.log(rel); // "cat/g" const re2 = new RegExp(rel); console.log(re2); // "cat/g"
RegExp实例属性
每一个RexExp实例都有下列属性,提供有关模式的各方面信息。
- global:布尔值,表示是否设置了g标记。
- ignoreCase:布尔值,表示是否设置了i标记。
- unicode:布尔值,表示是否设置了u标记
- sticky:布尔值,表示是否设置了y标记。
- lastIndex:整数,表示在源字符串中下一次搜索的开始位置,始终从0开始。
- multiline:布尔值,表示是否设置了m标记。
- dotAll:布尔值,表示是否设置了s标记。
- source:正则表达式的字面量字符串(不是传给构造函数的模式字符串),没有开头和结尾的斜杠。
- flags:正则表达式的标记字符串。始终以字面量而非传入构造函数的字符串模式形式返回(没有前后斜杠)。
let pattern1 = /\[bc\]at/i; console.log(pattern1.global); //false console.log(pattern1.ignoreCase); //true console.log(pattern1.multiline); //false console.log(pattern1.lastIndex); //0 console.log(pattern1.source); //"\[bc\]at" console.log(pattern1.flags); //"i"
RegExp实例方法
RegExp实例的主要方法是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"
到此这篇关于JavaScript通过RegExp使用正则表达式过程详解的文章就介绍到这了,更多相关JS RegExp内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!