Featured image of post 使用 v 標誌解鎖 JavaScript RegExp 功能Featured image of post 使用 v 標誌解鎖 JavaScript RegExp 功能

使用 v 標誌解鎖 JavaScript RegExp 功能

使用 v 標誌擴充功能升級您的模式:符合 Unicode 表情符號簇、交集類別和減法規則。

介紹

JavaScript 中的正規表示式已經有了顯著的發展。 ES2024 引入了 v 標誌u 標誌的超集,可解鎖強大的集合表示法、字符類減法、交集和正確的 Unicode 表情符號匹配。如果您一直在努力應對複雜的字元類邏輯或表情符號正規表示式模式,那麼 v 標誌將改變遊戲規則。


什麼是 v 標誌?

v 標誌取代並擴展了 u (unicode) 標誌。透過將 v 附加到您的正規表示式來啟用它:

const re = /[\p{Letter}]/v;

當設定 v 標誌時,該模式以 unicode 模式 運行,並具有用於設定操作的附加語法。與 u 標誌不同,v 模式將字元類別視為可以與布林運算組合的


集合表示法:字元類減法

最需要的正規表示式功能之一是能夠從一個字元類別中減去一個字元類別。 v 標誌引進了 -- 運算子:

// Match any letter except vowels
const re = /[\p{Letter}--[aeiouAEIOU]]/v;

console.log(re.test('b')); // true
console.log(re.test('a')); // false

其讀作是:「所有 Unicode 字母的集合,減去 ASCII 元音的集合。」減法運算符適用於任何嵌套字元類別。


字符類交集

&& 運算子計算兩個集合的交集

// Match Greek letters only
const re = /[\p{Letter}&&\p{Script=Greek}]/v;

console.log(re.test('α')); // true
console.log(re.test('a')); // false

將交集與減法結合可以實現精確的模式:

// Match Greek letters except 'α'
const re = /[[\p{Letter}&&\p{Script=Greek}]--[α]]/v;

嵌套字元類

v 標誌允許使用括號嵌套字元類,從而消除了令人困惑的轉義序列的需要:

// Without v flag — awkward
const re1 = /[a-z&&[^aeiou]]/u;

// With v flag — clean and readable
const re2 = /[[a-z]--[aeiou]]/v;

嵌套類別使複雜模式更易於維護。


改進了 Emoji 的 Unicode 屬性轉義

眾所周知,使用 u 標誌來匹配表情符號非常棘手。 v 標誌新增 \p{RGI_Emoji} 及相關屬性:

// Match a single emoji (including multi-codepoint sequences)
const re = /\p{RGI_Emoji}/v;

console.log(re.test('😀')); // true
console.log(re.test('👨‍👩‍👧‍👦')); // true (family emoji)
console.log(re.test('a'));  // false

其他新屬性包括:

物業描述
佔位符_0簡單的單碼點表情符號
佔位符_0鍵帽序列如 #️⃣
佔位符_0標記表情符號,如 🇯🇵
佔位符_0膚色變體

從 u 標誌遷移

v 標誌是嚴格的超集,但需要注意一些重大變更

特色u 標誌v 標誌
類別內的 \d符合 \d 文字不允許(使用 \\d 作為文字)
類別中嵌套 [文字括號開始巢狀類別
-- 在課堂上兩個字面連字減號減法運算符
&& 在課堂上兩個字面上的 & 符號交叉口算子

若要安全遷移,請使用在字元類別中包含 -& 的 codemod 或審核模式:

// u flag — literal hyphen
const old = /[\d\-x]/u;

// v flag — must escape or restructure
const new_ = /[\[\d\-x]/v;

瀏覽器和運行時支援

v 標誌在 Chrome 125+、Firefox 127+、Safari 17.5+ 和 Node.js 22+ 中支援。解析擴充功能無法進行 Polyfilling,但您可以使用兩個正規表示式回退策略:

const supportsVFlag = (() => {
  try { return new RegExp('', 'v') !== null; } catch { return false; }
})();

結論

v 標誌將 JavaScript 正規表示式從模式比對工具轉換為 設定處理語言。字元類減法 (--)、交集 (&&)、嵌套類別和適當的表情符號匹配使複雜模式可讀且可維護。如果您的目標是現代運行時,請採用 v — 未來的您會感謝您。