テック技報最新号へ →
コード

JavaScript: 正規表現の v フラグで文字クラスの差・積が書ける(ES2024)

/[\p{L}--[a-z]]/v のように、v フラグを付けると文字クラスの中で差(--)、積(&&)、入れ子のクラスが使える。「ギリシャ文字のうち母音以外」「ASCII の英数字のうち数字以外」を先読みのトリックなしで書ける。

@xah_lee · 投稿 2026-10-23
#javascript#regex#es2024#unicode

書き方

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 つのクラスの中で混ぜることはできない。入れ子のクラスで分ける。

出典

X の元の投稿を開く