修饰符: (?ims-ims:...)

实验性: 这是一种 实验性技术
在生产环境中使用之前,请仔细检查 浏览器兼容性表

修饰符 覆盖正则表达式特定部分中的 标志 设置。它可以用来启用或禁用更改某些正则表达式语法元素含义的标志。这些标志是 ims

语法

正则表达式
(?flags1:pattern)
(?flags1-flags2:pattern)

注意: JavaScript 只有 "有界" 修饰符形式,其中模式放在修饰符组内。大多数其他支持修饰符的语言都有 "无界" 形式,其中修饰符应用于最近包含组的末尾。

参数

flags1 可选

要启用的标志字符串。可以包含 ims 的任何组合。

flags2 可选

要禁用的标志字符串。可以包含 ims 的任何组合,但不能包含 flags1 中包含的任何标志。

模式

由您可以在正则表达式字面量中使用的任何内容组成的模式,包括 析取

描述

某些标志会更改正则表达式语法元素的含义

  • i 标志通过使所有 字面字符字符类 隐式变为小写,使正则表达式不区分大小写。
  • m 标志会更改 输入边界断言 ^$ 的行为,使其除了匹配输入字符串的开头和结尾之外,还匹配每行的开头和结尾。
  • s 标志会更改 通配符 . 字符的行为,使其匹配任何字符,包括行终止符。

有时您可能希望这些更改仅在正则表达式模式的特定部分生效。您可以通过将该部分括在修饰符中来实现。例如

js
/(?i:Hello) world/;

在这个正则表达式中,i 标志仅对模式的 Hello 部分启用。world 部分区分大小写。因此,它匹配 Hello worldhello worldHELLO world,但不匹配 HELLO WORLD。以下等效,通过全局启用 i 标志,然后对 world 部分禁用它

js
/Hello (?-i:world)/i;

flags1flags2 参数可以包含 ims 的任何组合。但是,标志在 flags1flags2 之间必须全部唯一 - 您不能两次启用或禁用标志,也不能先启用标志,然后立即禁用它。

flags1flags2 参数是可选的,但至少必须有一个非空。(?flags1-:pattern) 是一个仅启用标志的修饰符(等效于 (?flags1:pattern))。(?-flags2:pattern) 是一个仅禁用标志的修饰符。(?:pattern) 只是一个 非捕获组,而 (?-:pattern) 是一个语法错误。

其他标志在修饰符中没有意义,因此如果包含它们将是语法错误

  • gy 标志确定对 exec() 的多次调用的行为方式,并影响整个正则表达式的匹配行为。
  • d 标志在 exec() 结果中启用附加信息,并影响整个正则表达式的匹配行为。
  • uv 标志以一种过于复杂的方式更改正则表达式引擎的行为,无法在本地修改。它们也对正则表达式有全局影响,例如 lastIndex 的推进方式。

示例

仅在字符串开头匹配多行格式

以下正则表达式定义了多行字符串的格式。第一个 ^ 代表整个输入字符串的开头,因为在 (?-m:) 修饰符中,而所有其他 ^ 字符代表行的开头

js
const pattern = /(?-m:^)---\n^title:.*^slug:.*^---/ms;

const input = `---
title: "Modifier: (?ims-ims:...)"
slug: Web/JavaScript/Reference/Regular_expressions/Modifier
---`;

pattern.test(input); // true

// Extra line break at the start of string
const input2 = `\n${input}`;

pattern.test(input2); // false

不区分大小写地匹配某些单词

假设您要查找所有名为 foobar 的变量声明(因为它们是糟糕的名称)。该词可能会以任何大小写形式出现,但您知道关键字始终为小写,因此您可以这样做

js
const pattern = /(?:var|let|const) (?i:foo|bar)\b/i;

pattern.test("let foo;"); // true
pattern.test("const BAR = 1;"); // true
pattern.test("Let foo be a number"); // false

规范

规范
未知规范
# 语法

浏览器兼容性

BCD 表仅在浏览器中加载

另请参阅