先読みと後読みを使ったパターンの記述
【開発環境】
OS:Win11(64ビット)
VSCode1.72.2、
クロム
【正規表現における先読みと後読みとは】
先読み(肯定先読み、否定先読み)と後読み(肯定後読み、否定後読み)の書式は次の通りです。
パターンA(?=パターンB) 肯定先読み
パターンA(?!パターンB) 否定先読み
(?<=パターンB)パターンA 肯定後読み
(?<!パターンB)パターンA 否定後読み
先読みの場合→パターン A の直後にパターン B が続く場合(または続かない場合)にマッチする。
後読みの場合→ パターン A の直前にパターン B がある場合(またはない場合)にマッチします。
どちらもパターン B も含めてマッチするかどうか判断しますが、マッチした文字列として取得するのはパターン A にマッチした部分だけです。
【肯定の先読み】
肯定の先読みは、対象の文字列がパターン A の直後にパターン B に続く場合にマッチします。この時、マッチした値としてはパターン A にマッチした部分だけを取得します。
サンプル
let regexp = /smart(?=phone)/;
console.log(regexp.test('smart'));
>> false
console.log(regexp.test('smartphone'));
>> true
console.log(regexp.test('smartwatch'));
>> false
let result = regexp.exec('smartphone');
console.log(result[0]);
>> smart
smart のあとに phone が続く場合のみマッチします。 smartphone はマッチしますが、 smart や smartwatch はマッチしません。そしてマッチした文字列として取得するのは smart のみです
【否定の先読み】
否定の先読みは、対象の文字列がパターン A の直後にパターン B が続かない場合にマッチします。この時、マッチした値としてはパターン A にマッチした部分だけを取得します。
パターンA(?!パターンB) 否定先読み
サンプル
let regexp = /smart(?!phone)/;
console.log(regexp.test('smart'));
>> true
console.log(regexp.test('smartphone'));
>> false
console.log(regexp.test('smartwatch'));
>> true
let result = regexp.exec('smartwatch');
console.log(result[0]);
>> smart
smart のあとに phone が続かない場合のみマッチします。 smartphone にはマッチしませんが、 smart や smartwatch はマッチします。そしてマッチした文字列として取得するのは smart のみです。
【肯定の後読み】
肯定の後読みは、対象の文字列がパターン A の前にパターン B がある場合にマッチします。この時、マッチした値としてはパターン A にマッチした部分だけを取得します。
例えば次のパターンで考えてみます。
const regexp = /(?<=digital)camera/;
camera の直前に digital がある場合のみマッチします。 digitalcamera はマッチしますが、 camera や analogcamera はマッチしません。そしてマッチした文字列として取得するのは camera のみです。
サンプルコード
簡単なサンプルで試してみます。
let regexp = /(?<=digital)camera/;
console.log(regexp.test('camera'));
>> false
console.log(regexp.test('digitalcamera'));
>> true
console.log(regexp.test('analogcamera'));
>> false
//マッチした文字列を取得
let result = regexp.exec('digitalcamera');
console.log(result[0]);
>> camera
【否定の後読み】
否定の後読みは、対象の文字列がパターン A の前にパターン B がない場合にマッチします。この時、マッチした値としてはパターン A にマッチした部分だけを取得します。
例えば次のパターンで考えてみます。
const regexp = /(?<!digital)camera/;
camera の直前に digital がない場合のみマッチします。 digitalcamera にはマッチしませんが、 camera や analogcamera はマッチします。そしてマッチした文字列として取得するのは camera のみです。
サンプルコード
let regexp = /(?<!digital)camera/;
console.log(regexp.test('camera'));
>> true
console.log(regexp.test('digitalcamera'));
>> false
console.log(regexp.test('analogcamera'));
>> true
let result = regexp.exec('analogcamera');
console.log(result[0]);
>> camera