【译】JavaScript 开发者的正则表达式系列篇(3)

avatar
Advanced web developers @AOTHHOME

正则表达式标志

标志也被称为修饰符,标志是您可以放置在正则表达式模式的末尾或内部以更改其默认行为的特殊字符。

JavaScript 开发人员倾向于将这些字符称为 "flags",但在 Python 中,它们可以互换使用。

在 Python 中,您可以将标志放置在正则表达式模式中,但在 JavaScript 中,标志始终放置在正则表达式模式的末尾。

以下是您可以在正则表达式中使用的标志:

  1. 全局标志(global flag)
  2. 大小写不敏感标志(case insensitive flag)
  3. 多行标志(multi-line flag)
  4. 单行标志(single-line flag)
  5. Unicode标志(unicode flag)
  6. 粘附标志(sticky flag)

在许多正则表达式引擎中,您可以打开任何要使用的标志。在 regex101.com中,您可以通过点击模式输入框内的斜杠符号(/)来打开标志。

turn-on-a-flag-101

然后,您可以选择要使用的任何标志:

select-flag-101

注意:如果你在 regex101.com中选择的正则表达式的风格不是 ECMAScript,那么呈现给你的标志集可能会有所不同。

如果您使用的是 regexpal.com,请单击正则表达式模式输入上方的“标志”:

turn-on-flag-pal

通过单击选择所需的任何标志:

select-flag-pal

现在,让我们详细了解每个正则表达式标志以及它们如何在正则表达式引擎中工作。

全局标志 (global

全局标志由字母g表示。通过它,你可以对模式进行全局匹配。

还记得在本书的前一章中,我定义了一些模式,当它们找到第一个匹配项时就停止了,即使还有更多的匹配项。这是因为默认情况下,正则表达式只会在文本中找到第一个匹配项。但是使用全局标志g,将返回所有匹配项。

使用g标志的另一个好处是你可以在JavaScript中迭代模式的匹配项。迭代会一直进行,直到没有匹配项为止。不久后,你将了解多种迭代匹配项的方法。

为了让你看到g标志是如何工作的,我将使用前一章中的hatchfreeCodeCamp的示例。

如果你想使用模式h匹配单词hatch中的字母h,只要使用全局标志g,就会返回第一个和最后一个h作为匹配项:

h-in-hatch-g-match

如果你想 freeCodeCamp 与模式 e 匹配并打开 g 标志,第二个和第三个 e 也会作为匹配 e 返回:

e-in-fcc-g-match

大小写不敏感标志 (case-insensitive)

不区分大小写标志由字母i表示。顾名思义,它允许你执行不区分大小写的匹配。

默认情况下,正则表达式执行区分大小写的匹配。但使用i标志,你可以执行不区分大小写的匹配,因此在模式中不需要考虑大小写。

这意味着大写和小写将被忽略。这意味着 Hello和 Hello将被视为相同的内容:

hello-insensitive

freeCodeCamp 和 freecodecamp的处理方式也是相同的:

fcc-insensitive

RegEx 和 regex也是同一件事:

regex-insensitive

另一件事是,如果您使用字符类,例如 [a-z],如果您打开不区分大小写标志,它也会匹配大写字母。

因此,模式 [a-z] 也与打开不区分大小写标志的大写字母匹配:

carset-insensitive

多行模式和单行模式 (multi-line 和 single-line

用 m 表示,多行标志告诉正则表达式引擎测试字符串超过一行,由于多行标志会影响开始和结束锚元字符(^ 和 $)的行为,因此您将在锚点和单词边界一章中了解更多信息。

单行标志用 s 表示。就像多行标志一样,单行标志也可以与称为通配符 ( .) 的元字符一起使用。您将在元字符章节下看到正在运行的单行标志。

Unicode标志(Unicode )

Unicode 标志在支持它的正则表达式引擎中启用完整的 Unicode 匹配。用u表示。

默认情况下,JavaScript 和许多其他编程语言将字符串视为 16 位代码单元的序列。使用 u 标志,正则表达式模式可以匹配 Unicode 代码点而不是代码单元。这允许处理表情符号、某些符号和非拉丁脚本中的字符等字符。因此,当您设置该标志时,它会修改某些转义序列和元字符的行为以与正则表达式一起使用。

例如,如果不打开 u 标志,转义序列 \u{1F602}将匹配文字字符 u{1F602}

u-flag-literal-match

但如果你打开 u 标志,相同的模式会匹配泪水表情符号:

u-flag-emoji-match

这是匹配表情符号和其他 Unicode 字符的一种方法。获取表情符号的 Unicode,并将十六进制放在大括号中,然后在两者前面加上 \u

例如,"growing heart" 的 Unicode 编码是 U+1F497,要匹配它的模式应该是 \u{1F497}

growing-heart-match

您将在有关如何在 JavaScript 中使用正则表达式的章节中看到有关该标志如何工作的更多示例。

粘附标志(sticky

粘性标志由字母 y 表示,它是 ECMAScript 6 中实现的 JavaScript 正则表达式的一个特性。 y 标志限制了匹配到字符串的当前位置,你可以通过RegExp()构造函数的lastIndex属性来指定匹配的位置。

当你使用 y 标志时,它会使用lastIndex属性来确定下一次搜索从哪里开始。只有当模式恰好出现在lastIndex 位置或字符串的开头时,匹配才会成功。

与全局标志(g)不同, y 标志不会找到所有匹配项,而是在找到第一个成功匹配后停止。

在像 regex101.com 这样的正则表达式引擎中, y 标志通常会锚定在测试字符串的开头并在那里停止匹配:

anchor-flag-match

由于y标志通常与 JavaScript 正则表达式的 lastIndex 属性一起使用,我们将在有关如何在 JavaScript 中使用正则表达式的章节中查看更多示例,特别是当我们查看正则表达式构造函数的sticky属性时。

你还可以组合多个标志以编写更复杂的语法。例如,你可以使用g标志和i标志来进行全局和不区分大小写的匹配:

g-and-i-flag

在线工具

参考文献