[路飞]_红宝书读书笔记(三)

368 阅读2分钟

RegExp

let expression = /pattern/flags;

JavaScript RegExp 对象

MDN Web Docs - RegExp

这个正则表达式的 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() 方法返回一个数组(包含额外的属性 indexinput ,参见下方表格),并更新正则表达式对象的 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. 1RegExp.1 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 标准出处,因此不要在生产环境中使用它们。