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

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

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

语法

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

注意:JavaScript 只有“有界”修饰符形式,其中模式位于修饰符组内。大多数其他支持修饰符的语言都有“无界”形式,其中修饰符会一直应用到最近的包含组的末尾。

参数

flags1 可选

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

flags2 可选

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

pattern

此模式可以包含任何可在正则表达式字面量中使用的内容,包括或运算符

描述

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

  • 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/;

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

规范

规范
ECMAScript® 2026 语言规范
# prod-RegularExpressionModifiers

浏览器兼容性

另见