2024-12-19 日报 Day40

2024-12-19 日报 Day40

Yuyang 前端小白🥬

今日的鸡汤

在哪里付出,就在哪里得到;在哪里打磨,就在哪里闪耀。

今日学习内容

1、JS红皮书P109-111 第五章:基本引用类型

今日笔记

1、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”
2、RegExp 实例的主要方法是 exec(),主要用于配合捕获组使用。这个方法只接收一个参数,即要应用模式的字符串。如果找到了匹配项,则返回包含第一个匹配信息的数组;如果没找到匹配项,则返回null。返回的数组虽然是 Array 的实例,但包含两个额外的属性:index 和 input。index 是字符串中匹配模式的起始位置,input 是要查找的字符串。这个数组的第一个元素是匹配整个模式的字符串,其他元素是与表达式中的捕获组匹配的字符串。如果模式中没有捕获组,则数组只包含一个元素。来看下面的例子:

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"

在这个例子中,模式包含两个捕获组:最内部的匹配项” and baby”,以及外部的匹配项” and dad”或” and dad and baby”。调用 exec()后找到了一个匹配项。因为整个字符串匹配模式,所以 matchs数组的 index 属性就是 0。数组的第一个元素是匹配的整个字符串,第二个元素是匹配第一个捕获组的字符串,第三个元素是匹配第二个捕获组的字符串。
如果模式设置了全局标记,则每次调用 exec()方法会返回一个匹配的信息。如果没有设置全局标
记,则无论对同一个字符串调用多少次 exec(),也只会返回第一个匹配的信息。

1
2
3
4
5
6
7
8
9
10
let text = "cat, bat, sat, fat"; 
let pattern = /.at/;
let matches = pattern.exec(text);
console.log(matches.index); // 0
console.log(matches[0]); // cat
console.log(pattern.lastIndex); // 0
matches = pattern.exec(text);
console.log(matches.index); // 0
console.log(matches[0]); // cat
console.log(pattern.lastIndex); // 0

上面例子中的模式没有设置全局标记,因此调用 exec()只返回第一个匹配项(”cat”)。lastIndex在非全局模式下始终不变。
如果在这个模式上设置了 g 标记,则每次调用 exec()都会在字符串中向前搜索下一个匹配项,如下面的例子所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
let text = "cat, bat, sat, fat"; 
let pattern = /.at/g;
let matches = pattern.exec(text);
console.log(matches.index); // 0
console.log(matches[0]); // cat
console.log(pattern.lastIndex); // 3
matches = pattern.exec(text);
console.log(matches.index); // 5
console.log(matches[0]); // bat
console.log(pattern.lastIndex); // 8
matches = pattern.exec(text);
console.log(matches.index); // 10
console.log(matches[0]); // sat
console.log(pattern.lastIndex); // 13

这次模式设置了全局标记,因此每次调用 exec()都会返回字符串中的下一个匹配项,直到搜索到
字符串末尾。注意模式的 lastIndex 属性每次都会变化。在全局匹配模式下,每次调用 exec()都会更新 lastIndex 值,以反映上次匹配的最后一个字符的索引。
粘附模式要求正则匹配必须从 lastIndex 指定的位置开始,不能跳过字符,否则匹配失败。
正则表达式的另一个方法是 test(),接收一个字符串参数。如果输入的文本与模式匹配,则参数
返回 true,否则返回 false。这个方法适用于只想测试模式是否匹配,而不需要实际匹配内容的情况。test()经常用在 if 语句中:

1
2
3
4
5
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()方法返回正则表达式本身。

此页目录
2024-12-19 日报 Day40