正規表現の先読み・後読みを使う場面

目次

「マッチはさせたいが消費したくない」ときに使う構文。

構文の整理

構文 名前 意味
(?=...) 肯定先読み 直後に ... が続く位置
(?!...) 否定先読み 直後に ... が続かない位置
(?<=...) 肯定後読み 直前が ... である位置
(?<!...) 否定後読み 直前が ... でない位置

実例: 数値の 3 桁区切り

const format = (n) =>
  String(n).replace(/\B(?=(\d{3})+(?!\d))/g, ',');

format(1234567); // => "1,234,567"

\B と先読みの組み合わせで「3 桁ごとの境界位置」だけにカンマを挿入する。文字自体は消費しないので置換対象は空文字の位置になる。

実例: パスワード要件

// 8文字以上・英大文字と数字を各1文字以上含む
const ok = /^(?=.*[A-Z])(?=.*\d).{8,}$/.test(input);

先読みを並べると AND 条件になる。それぞれの (?=...) は位置を進めずに条件だけ検査する。

後読み (?<=...) は環境によって可変長を許さない(JS は許す、PCRE は固定長のみ)。移植時は注意。