JavaScript: 正規表現の v フラグで文字クラスの差・積が書ける(ES2024)
/[\p{L}--[a-z]]/v のように、v フラグを付けると文字クラスの中で差(--)、積(&&)、入れ子のクラスが使える。「ギリシャ文字のうち母音以外」「ASCII の英数字のうち数字以外」を先読みのトリックなしで書ける。
書き方
js
// 差: Unicode の文字のうち ASCII 小文字以外
/[\p{L}--[a-z]]/v.test("é"); // true
/[\p{L}--[a-z]]/v.test("e"); // false
// 積: ギリシャ文字かつ文字(記号を除く)
/[\p{Script=Greek}&&\p{Letter}]/v;
// 差の応用: 空白のうち改行以外
/[\s--[\n\r]]/v;
// 文字列のプロパティ: 複数のコードポイントからなる絵文字を 1 つとして扱う
/^\p{RGI_Emoji}$/v.test("👨👩👧"); // true(u フラグでは書けない)u フラグとの違い
vはuの上位版で、同時には指定できない(/x/uvは SyntaxError)。vでは文字クラス内の(,),[,{,/,-,|などをエスケープする必要がある。uの正規表現にそのままvを付けると構文エラーになることがある。- 大文字小文字を無視する
iと否定クラスの組み合わせの挙動がuより素直になっている。
注意点
- 対応は Chrome 112 / Firefox 116 / Safari 17 / Node 20 以降。古い環境向けにはトランスパイル(Babel の該当プラグイン)が要る。
--と&&を 1 つのクラスの中で混ぜることはできない。入れ子のクラスで分ける。
出典
- @xah_lee · 2026-10-23
- @xah_lee · 2026-10-24
- MDN「RegExp.prototype.unicodeSets」: developer.mozilla.org