语法
正则表达式
(?flags1:pattern)
(?flags1-flags2:pattern)
注意:JavaScript 只有“有界”修饰符形式,其中模式位于修饰符组内。大多数其他支持修饰符的语言都有“无界”形式,其中修饰符会一直应用到最近的包含组的末尾。
参数
描述
某些标志会改变正则表达式语法元素的含义
i标志通过使所有文字字符和字符类隐式为小写来使正则表达式不区分大小写。m标志会改变输入边界断言^和$的行为,使其除了匹配输入字符串的开头和结尾之外,还匹配每一行的开头和结尾。s标志会改变通配符.字符的行为,使其匹配任何字符,包括行终止符。
有时,你可能希望这些更改只在正则表达式模式的特定部分生效。你可以通过将该部分包装在修饰符中来实现。例如:
js
/(?i:Hello) world/;
在此正则表达式中,i 标志仅对模式的 Hello 部分启用。world 部分区分大小写。因此,它匹配 Hello world、hello world 和 HELLO world,但不匹配 HELLO WORLD。以下是等效的,通过全局启用 i 标志,然后为 world 部分禁用它:
js
/Hello (?-i:world)/i;
flags1 和 flags2 参数可以包含 i、m 和 s 的任意组合。但是,flags1 和 flags2 之间的标志必须都是唯一的——你不能两次启用或禁用一个标志,也不能先启用一个标志然后立即禁用它。
flags1 和 flags2 参数是可选的,但至少一个必须非空。(?flags1-:pattern) 是一个只启用标志的修饰符(等同于 (?flags1:pattern))。(?-flags2:pattern) 是一个只禁用标志的修饰符。(?:pattern) 只是一个非捕获组,而 (?-:pattern) 是一个语法错误。
其他标志在修饰符中没有意义,因此如果包含它们,则会是语法错误
示例
仅在字符串开头匹配多行格式
以下正则表达式定义了多行字符串的格式。第一个 ^ 通过位于 (?-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
不区分大小写地匹配某些单词
假设你要查找所有名为 foo 或 bar 的变量声明(因为它们是糟糕的名称)。该单词可能以任何大小写形式出现,但你知道关键字始终是小写,因此你可以这样做:
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 |
浏览器兼容性
加载中…