Logo
Section 1 / 4

字面字符

了解正则表达式中最简单的匹配方式。

导入

字面字符

了解正则表达式中最简单的匹配方式。

字面字符概述

深入探讨字面模式匹配。

字面字符的特性:只匹配与自身相同的字符。

要匹配文本本身,我们通常使用字面字符。

匹配字母的例子

例如,要匹配包含“cat”的所有单词,正则表达式为 /cat/。请注意,默认情况下,正则表达式只会返回第一个匹配结果。若要匹配所有 /cat/ 的实例,请使用全局标志(g)。我们也可以创建仅包含单个字符的正则表达式。假设你想匹配数字“1”的每次出现,那么正则表达式就是 /1/。

假设你有文本 "cat, catastrophic, catalyst",它会从正则表达式的字符 "c" 开始与文本中的 "c" 进行匹配,这将成功。然后继续下一个字符,匹配 "a",再匹配 "t"。整个模式与文本完成匹配后返回结果。如果启用了全局标志,搜索将从文本中下一个字符 "," 开始,并再次尝试与正则表达式的 "c" 匹配,但不会成功。由于文本尚未结束,将继续检查下一个字符。下一个字符是空格 " ",同样不匹配。依此类推,逐个字符进行匹配,最终以分隔形式返回结果。

1var str = "cat, catastrophic, catalyst" 2console.log(str.match(/cat/)); 3 4// 这将匹配第一个 cat 5// 现在通过添加 "g"(不加引号)开启全局标志 6// 例如 (/cat/g),查看输出 7// 匹配到的单词位于索引 0、5、19

再来看另一个字符串。假设你要匹配所有包含 "FaN" 的文本,正则表达式为 /FaN/g,由于其大小写敏感性,必须原样书写。如果你使用不区分大小写的标志 i,那么大写 "F" 和小写 "f" 将被视为相同,其他字母也一样。但如果不使用 i 标志,大写 "F" 就只匹配大写 "F",小写 "a" 也只匹配小写 "a"。

1var str = "FaN, Fan, Fantastic, FaNtastic" 2console.log(str.match(/FaN/)); 3 4// 这将匹配第一个 FaN 5// 现在通过添加 "g"(不加引号)开启全局标志 6// 例如 (/FaN/g),查看输出 7// 匹配到的单词位于索引 0、21 8// 现在开启不区分大小写标志 9// 例如 (/FaN/gi),查看输出 10// 输出将包含全部 4 个 "Fan"

匹配数字的例子

这次我们看一个包含数字的例子。例如,要在文本中匹配 "123",正则表达式为 /123/g。它将匹配文本中所有 "123" 的出现。在文本 "12345" 中,它会匹配 "123";在文本 "12312312" 中,它会先匹配 "123",然后从索引三处重新开始搜索,再次匹配 "123",接着从索引六处继续,但由于文本已结束,完整模式无法再次匹配。因此返回的结果是 "123,123"。

...
正则表达式输出

让我们做一个小练习。在继续阅读之前,试着弄清楚为什么正则表达式 /123/g 的输出是 “123,123”。

  • 正则表达式1是一个单字符,每次匹配构成一个组。由于使用了全局标志,它不会表现出贪婪性,而是会搜索整个文本。

  • 正则表达式2是一组字符。只有当该组中所有字符都匹配时才会返回结果。同时因为有全局标志,它会持续搜索直到文本结束。第一个 "Ran" 来自 "Random",第二个 "Ran" 来自 "Ransom",但 "Ran" 不会匹配 "ran",因为在正则表达式中指定了大写 "R",而文本中是小写 "r"。

  • 正则表达式3是单个字符,但由于未使用全局标志,正则表达式是贪婪的,会立即返回第一个字面匹配结果。正则表达式中的字符 "o" 与文本 "Random" 中的 "o" 匹配。

字面匹配的可视化表示

...
字面匹配的可视化表示

在上述文本中,正则表达式1会匹配 "my",但不会匹配 "My",因为字面字符默认是大小写敏感的。因此小写 "m" 不会匹配大写 "M"。同样,正则表达式3会匹配 "text",但不会匹配 "texT",因为小写 "t" 不会匹配大写 "T"。

一项挑战:匹配所有字面字符

编写正则表达式以匹配文本中所有的大写字母 "F"。在编写时请牢记正则表达式的字面默认行为。

将正则表达式写在边界内:str.match(/ RegEx / 标志)

思考时间
思考时间
1let match = function(str){ 2 // return str.match(/xyz/m); 3 return str.match(); 4}

上述挑战的解决方案

要成功通过测试,必须仔细阅读题目。你需要找到所有 "F" 的出现位置。由于正则表达式具有贪婪性,应使用全局标志来返回所有可能的匹配。

适用于字母的所有规则同样适用于数字和下划线符号 "_",因为它们都被归类为字面字符。

一项挑战:预测正则表达式的输出

写出评论中提到的正则表达式在指定文本 **str** 上的输出结果。

如果正则表达式为 /123/g,文本为 "123123",则输出为 "123,123"。请将每个正则表达式的输出结果用双引号括起来,放入答案数组中,用逗号分隔。

思考时间
思考时间
1var match = function(){ 2 let str = "12_ab12_ab1212_a" 3 // 正则表达式1 /a/g 4 // 正则表达式2 /_ab1/g 5 // 正则表达式3 /12_ab1/g 6 // 正则表达式4 /12_ab/ 7 // ["输出_1", "输出_2", "输出_3", "输出_4"] 用双引号括起来,用逗号分隔。 8 return []; 9}

上述挑战的解决方案

  • 正则表达式1 会匹配所有 "a" 的出现,因为使用了全局标志。输出为 "a,a,a"。

  • 正则表达式2 会匹配所有 "_ab1" 字符串的出现,因为使用了全局标志。输出为 "_ab1,_ab1"。

  • 正则表达式3 与正则表达式2 类似,只是匹配的字符组不同。输出为 "12_ab1"。

  • 正则表达式4 默认是贪婪的,因此输出为 "12_ab"。

在课程后续部分,你将学习到特殊字符(魔法字符)。

正则表达式简介

通配符字符