Lookahead

概要: このチュートリアルでは、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)

出力

15Code language: PHP (php)

Regex 複数の lookahead

正規表現内で次の構文を使用して、複数の lookahead を持つことができます。

 X(?=Y)(?=Z)Code language: JavaScript (javascript)

この構文では、regex エンジンは次の手順を実行します。

  1. X を検索します
  2. X の直後に Y があるかどうかを確認します。ない場合はスキップします。
  3. Y の直後に Z もあるかどうかを確認します。ない場合はスキップします。
  4. 両方のテストに合格した場合、X を一致として返します。それ以外の場合は、次の一致を検索します。

したがって、X(?=Y)(?=Z)XYZ が同時に続くものに一致します。

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)

出力

1Code language: plaintext (plaintext)

概要

  • regex lookahead X(?=Y) は、X の後に Y が続く場合にのみ X に一致します。
  • ネガティブ regex lookahead X(?!Y) は、X の後に Y が続かない場合にのみ X に一致します。
このチュートリアルは役に立ちましたか?