正規表現の 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 62+, Edge 79+(Chromiumベース), 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. Lookahead との違い / Lookbehind vs lookahead
| 構文 / Syntax | 名称 | 意味 |
|---|---|---|
(?=x) | 肯定lookahead | 直後にxが続く位置にマッチ(xは消費しない) |
(?!x) | 否定lookahead | 直後にxが続かない位置にマッチ |
(?<=x) | 肯定lookbehind | 直前にxがある位置にマッチ(xは消費しない) |
(?<!x) | 否定lookbehind | 直前にxがない位置にマッチ |
lookaheadはES3(1999年)からJavaScriptで使え、ブラウザ対応で悩む必要はありません。対応状況が問題になるのは lookbehind((?<= と (?<!)だけです。
6. 他言語での対応状況 / Support in other languages
ブラウザ間の対応差だけでなく、言語・正規表現エンジンごとに lookbehind の制約が異なります。 他言語のコードを JavaScript へ移植する際は特に注意してください。
| 言語・エンジン / Language | lookbehindの制約 |
|---|---|
| JavaScript (V8/SpiderMonkey/JavaScriptCore) | 可変長OK(制約なし) |
Python re | 固定長のみ(全ての選択肢が同じ長さである必要あり)。可変長が要るなら regex パッケージを使う |
| .NET (C#) | 可変長OK |
| Java | 可変長だが上限のある繰り返しのみ対応(無制限の量指定子は不可) |
| PHP / Perl (PCRE) | 伝統的に固定長のみ。バージョンにより異なるため事前に確認する |
「Pythonで動いた正規表現をJSに移植したら動かない」という逆のパターンもあり得ます。Pythonは固定長制約が JSより厳しいため、Python側で通っていた可変長lookbehindはJSでは書き直しが必要な場合があります。
7. 機能検知でグレースフルに対応する / Feature detection
古いSafari/iOSを完全に切り捨てられない場合、lookbehindが使えるかを実行時に検知し、 エラーにせず代替ロジックへフォールバックする方法もあります。
function supportsLookbehind() {
try {
new RegExp("(?<=x)");
return true;
} catch {
return false;
}
}
const pattern = supportsLookbehind()
? /(?<=\$)\d+/
: null; // null の場合は代替のキャプチャグループ実装へ分岐SyntaxErrorは正規表現リテラルのパース時に発生するため、lookbehindを含む正規表現は 文字列からのnew RegExp()として動的に生成し、対応チェックの後でのみ使うようにすると 非対応環境でもスクリプト全体が落ちるのを防げます。
8. 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.
よくある質問 / FAQ
- Safari で lookbehind は動く?
- Safari 16.4 (2023年3月) 以降でサポートされます。iOS 16.4 以降も同様。古いバージョンを想定する場合はキャプチャグループ置換で代替。
- Does Safari support regex lookbehind?
- Yes — from Safari 16.4 / iOS 16.4 (released March 2023). Before that, use a capture-group fallback.
- 可変長 lookbehind は使える?
- V8 (Chrome/Edge/Node) と Firefox は可変長対応。WebKit も対応済み。ただし古いランタイムに配る場合は固定長のみに留めると安全。