RegExp
let expression = /pattern/flags;
这个正则表达式的 pattern(模式)可以是任何简单或复杂的正则表达式,包括字符类、限定符、 分组、向前查找和反向引用。每个正则表达式可以带零个或多个 flags(标记),用于控制正则表达式 的行为。
下面给出了表示匹配模式的标记。
- g: 全局模式, 表示查找字符串的全部内容,而不是找到第一个匹配的内容就结束。
- i: 不区分大小写,表示在查找匹配时忽略 pattern 和字符串的大小写
- m: 多行模式, 表示查找到一行文本末尾时会继续查找
- y: 粘附模式,表示只查找从 lastIndex 开始及之后的字符串
- u: Unicode模式, 启用Unicode匹配
- s: dotAll模式,表示元字符
.匹配任何字符(包括 \n 或 \r)
元字符:是指在正则匹配中有特殊含义,具有一种或多种特殊功能的字符。 ( [ { \ ^ $ | ) ] } ? * + .
要匹配这些元字符本身,就必须使用反斜杠来转义。 eg ``let pattern = /[bc]at/i ;`
RegExp 实例属性
每个 RegExp 实例都有以下属性,提供有关模式的各方面信息。
- 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"
let pattern2 = new RegExp("\\[bc\\]at", "i");
console.log(pattern2.global); // false
console.log(pattern2.ignoreCase); // true
console.log(pattern2.multiline); // false
console.log(pattern2.lastIndex); // 0
console.log(pattern2.source); // "\[bc\]at"
console.log(pattern2.flags); // "i"
注意,虽然第一个模式是通过字面量创建的,第二个模式是通过 RegExp 构造函数创建的,但两个 模式的 source 和 flags 属性是相同的。source 和 flags 属性返回的是规范化之后可以在字面量中 使用的形式。
RegExp 实例方法
RegExp.prototype.exec(str)
The exec() method executes a search for a match in a specified string. Returns a result array, or null.
regexObj.exec(str)
参数
-
str要匹配正则表达式的字符串。
返回值
如果匹配成功,exec() 方法返回一个数组(包含额外的属性 index 和 input ,参见下方表格),并更新正则表达式对象的 lastIndex 属性。完全匹配成功的文本将作为返回数组的第一项,从第二项起,后续每项都对应正则表达式内捕获括号里匹配成功的文本。
如果匹配失败,exec() 方法返回 null,并将 lastIndex 重置为 0 。
test 方法
The test() method executes a search for a match between a regular expression and a specified string. Returns true or false. test() 方法执行一个检索,用来查看正则表达式与指定的字符串是否匹配。返回 true 或 false。 具体用法
RegExp.prototype.test()
regexObj.test(str)
参数
-
str用来与正则表达式匹配的字符串
返回值
如果正则表达式与指定的字符串匹配 ,返回true;否则false。
描述
当你想要知道一个正则表达式是否与指定的字符串匹配时,就可以使用 test()(类似于 String.prototype.search() 方法),差别在于test返回一个布尔值,而 search 返回索引(如果找到)或者-1(如果没找到);若想知道更多信息(然而执行比较慢),可使用exec() 方法(类似于 String.prototype.match() 方法)。 和 exec() (或者组合使用),一样,在相同的全局正则表达式实例上多次调用test将会越过之前的匹配。
RegExp 构造函数属性(静态属性)
| 全名 | 简写 | 说明 |
|---|---|---|
| input | $__ | 最后搜索的字符串(非标准特性) |
| lastMatch | $& | 最后匹配的文本 |
| lastParen | $+ | 最后匹配的捕获组(非标准特性 |
| leftContext | $``` | input 字符串中出现在 lastMatch 前面的文本 |
| rightContext | $' | input 字符串中出现在 lastMatch 后面的文本 |
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
}
RegExp 还有其他几个构造函数属性,可以存储最多 9 个捕获组的匹配项。这些属性通过 RegExp. 9 来访问,分别包含第 1~9 个捕获组的匹配项。在调用 exec()或 test()时,这些属性就会被填充,然后就可以像下面这样使用它们:
let text = "this has been a short summer";
let pattern = /(..)or(.)/g;
if (pattern.test(text)) {
console.log(RegExp.$1); // sh
console.log(RegExp.$2); // t
}
注意:::::RegExp 构造函数的所有属性都没有任何 Web 标准出处,因此不要在生产环境中使用它们。