概要: このチュートリアルでは、X
に一致するが、それに Y
が続く場合にのみ一致する JavaScript regex lookahead について学習します。
JavaScript regex lookahead の概要
正規表現では、lookahead を使用すると、X
に一致しますが、それに Y
が続く場合にのみ一致します。
lookahead の構文は次のとおりです。
X(?=Y)
Code language: JavaScript (javascript)
この構文では、regex エンジンが X
を検索し、その後に Y
が続く場合にのみ一致します。
たとえば、次のような文字列があるとします。
const s = '1 car is 15 feet long';
Code language: JavaScript (javascript)
ここで、数字 15 の後にスペースと文字列リテラル feet
が続き、数字 1
が続かないものに一致させたいとします。それには、正規表現で lookahead を使用できます。
/\d+(?=\s*feet)/
Code language: JavaScript (javascript)
この正規表現では
\d+
は 1 桁以上の数字に一致します?=
は lookahead 構文です\s*
は 0 個以上の空白文字に一致しますfeet
は文字列リテラルfeet
に一致します
次のコードは、上記の式を使用して、0 個以上の空白文字と文字列リテラル feet
の後に続く数字に一致します。
const s = '1 car is 15 feet long';
const pattern = /\d+(?=\s*feet)/;
const match = s.match(pattern);
console.log(match);
Code language: JavaScript (javascript)
出力
15
Code language: PHP (php)
Regex 複数の lookahead
正規表現内で次の構文を使用して、複数の lookahead を持つことができます。
X(?=Y)(?=Z)
Code language: JavaScript (javascript)
この構文では、regex エンジンは次の手順を実行します。
- X を検索します
- X の直後に Y があるかどうかを確認します。ない場合はスキップします。
- Y の直後に Z もあるかどうかを確認します。ない場合はスキップします。
- 両方のテストに合格した場合、X を一致として返します。それ以外の場合は、次の一致を検索します。
したがって、X(?=Y)(?=Z)
は X
と Y
と Z
が同時に続くものに一致します。
Regex ネガティブ lookahead
次の文字列で数字 1
に一致させたいが、数字 15
には一致させたくない場合があります。
const s = '1 car is 15 feet long';
Code language: JavaScript (javascript)
それには、ネガティブ lookahead を使用します。ネガティブ lookahead の構文は次のとおりです。
X(?!Y)
Code language: JavaScript (javascript)
この構文では、regex エンジンは X
の後に Y
が続かない場合にのみ X
に一致します。
次の例は、ネガティブ lookahead の使い方を示しています。
const s = '1 car is 15 feet long';
const pattern = /\d+(?!\s*feet)/;
const match = s.match(pattern);
console.log(match);
Code language: JavaScript (javascript)
出力
1
Code language: plaintext (plaintext)
概要
- regex lookahead
X(?=Y)
は、X
の後にY
が続く場合にのみX
に一致します。 - ネガティブ regex lookahead
X(?!Y)
は、X
の後にY
が続かない場合にのみX
に一致します。
このチュートリアルは役に立ちましたか?