修飾符:(?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

瀏覽器相容性

另見