基础知识

创建语法

  • 正则表达式的 pattern(模式)可以是任何简单或复杂的正则表达式,包括字符类、限定符、分组、向前查找和反向引用;
  • 每个正则表达式可以ࣛ带零个或多个 flags(标记),用于控制正则表达式的行为。
1
let expression = /pattern/flages;
flags 作用
g 全局模式,表示查找字符串的全部内容,而不是找到第一个匹配的f内容就结束
i 不区分大小写,表示在查找匹配时忽略 pattern 和字符串的大小写
m 多行模式,表示查找到一行文本末尾时会继续查找
y 粘附模式,表示只查找从 lastIndex 开始及之后的字符串
u Unicode 模式,启用 Unicode 匹配
s dotAll 模式,表示元字符.匹配任何字符(包括\n 或\r)
  • 元字符包括:( [ { \ ^ $ | ) ] } ? * + .
  • 所有元字符在模式中也必须转义
1
2
3
4
5
6
7
8
// 匹配第一个"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 实ׁኔᙝ

  • global:布尔值,表示是否设置了 g 标记。
  • ignoreCase:布尔值,表示是否设置了 i 标记。
  • unicode:布尔值,表示是否设置了 u 标记。
  • sticky:布尔值,表示是否设置了 y 标记。
  • lastIndex:整数,表示在源字符串中下一次搜索的开始位置,始终从 0 开始。
  • multiline:布尔值,表示是否设置了 m 标记。
  • dotAll:布尔值,表示是否设置了 s 标记。
  • source:正则表达式的字面量字符串(不是传给构造函数的模式字符串),没有开头和结尾的斜杠。
  • flags:正则表达式的标记字符串。始终以字面量而非传入构造函数的字符串模式形式返回(没有前后斜杠)
1
2
3
4
5
6
7
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
    • 返回的数组包含两个额外的属性:index 和 input,index 是字符串中匹配模式的起始位置,input 是要查找的字符串
  • 如果没有设置全局标记,则无论对同一个字符串调用多少次 exec(),也只会返回第一个匹配的信息
1
2
3
4
5
6
7
8
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"

RegExp 构造函数属性

  • 这些属性适用于作用域中的所有正则表达式,而且会根据最后执行的正则表达式操作而变化;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
let text = "this has been a short summer"; 
let pattern = /(.)hort/g;
if (pattern.test(text)) {
console.log(RegExp.input); // this has been a short summer
console.log(RegExp.leftContext); // this has been a
console.log(RegExp.rightContext); // summer
console.log(RegExp.lastMatch); // short
console.log(RegExp.lastParen); // s
}
//==============等价于==============
let text = "this has been a short summer";
let pattern = /(.)hort/g;
/*
* 注意:Opera 不支持简写属性名
* IE 不支持多行匹配
*/
if (pattern.test(text)) {
console.log(RegExp.$_); // this has been a short summer
console.log(RegExp["$`"]); // this has been a
console.log(RegExp["$'"]); // summer
console.log(RegExp["$&"]); // short
console.log(RegExp["$+"]); // s
}
  • 以上代码创建了一个模式,用于搜索任何后跟”hort”的字符,并把第一个字符放在了捕获组中。不同属性包含的内容如下:
  • input 属性中包含原始的字符串。
  • leftConext 属性包含原始字符串中”short”之前的内容,rightContext 属性包含”short”之后的内容。
  • lastMatch 属性包含ӛ配整个正则表达式的上一个字符串,即”short”。
  • lastParen 属性包含捕获组的上一次匹配,即”s”。

局限模式

下列特性目前还没有得到 ECMAScript 的支持:

  • \A 和\Z 错(分别匹配字符串的开始和末尾)
  • 联合及交叉类
  • 原子组
  • x(忽略空格)匹配模式
  • 条件式匹配
  • 正则表达式注释