正規表現の Lookbehind はどのブラウザで使える?
(?<=...) と (?<!...) は強力ですが、長らく Safari が未対応で本番投入を ためらわれた機能でした。2026年現在は主要ブラウザすべてで動作しますが、対応バージョンを跨ぐ プロダクトでは今も注意が要ります。
JavaScript regex lookbehind is supported in all major evergreen browsers today, but the Safari/iOS cut-off (16.4, March 2023) still matters if you target older devices.
TL;DR
- Chrome/Edge 62+, Firefox 78+, Safari 16.4+, Node.js 10+
- iOS 16.3 以前は
SyntaxError: Invalid regular expression - 互換重視ならキャプチャグループ +
$1置換で代替
1. ブラウザ対応表 / Browser support
| ランタイム / Runtime | 対応開始 / Since | 備考 / Notes |
|---|---|---|
| Chrome / Edge | 62 (2017) | 可変長対応 |
| Firefox | 78 (2020) | 可変長対応 |
| Safari (macOS) | 16.4 (2023) | それ以前は SyntaxError |
| iOS Safari | 16.4 (2023) | iPhone 5s/6 系は更新停止で非対応 |
| Node.js | 10+ | V8 準拠 |
2. 互換のための代替パターン / Fallback patterns
Safari 16.3 以前を含めて配信する場合、lookbehind を避けてキャプチャで書き換えます。
// ❌ 直接 lookbehind
"$100".replace(/(?<=\$)\d+/, m => Number(m) * 1.1);
// ✅ 代替: 先頭をキャプチャして残す
"$100".replace(/(\$)(\d+)/, (_, $, n) => $ + Number(n) * 1.1);3. 実害が出るケース / Where it actually breaks
- SSR で問題なかったのに iOS 16.3 のユーザで真っ白 →
SyntaxErrorが JS 全体を落とす - A/B テストの配信スクリプトで lookbehind を使い、古い Safari だけイベント送信が止まる
- eslint-plugin-regexp で警告を出す設定を追加しておくと事故を防ぎやすい
4. いつ lookbehind を使うべきか / When to use
Node.js (サーバ) とモダン Chrome/Edge の社内ツールでは積極的に使って構いません。 一方 B2C の公開 Web、メルマガ HTML の動的差し替え、広告配信タグなど、古い iOS が残る領域では 代替パターンを選ぶのが安全です。
5. English summary
Regex lookbehind ((?<=x), (?<!x)) is universally supported in modern Chrome, Edge, Firefox and Node. Safari and iOS added it in 16.4(March 2023). For public-facing sites that still serve long-tail iOS users, prefer a capture-group fallback — a single unsupported regex throws SyntaxError at parse time and takes the whole script with it.