職案人

求職・歴史・仏教などについて掲載するつもりだが、自分の思いつきが多いブログだよ。適当に付き合って下さい。

JS--パターンの先読み・後読み

2024年05月02日 | JavaScript

先読みと後読みを使ったパターンの記述

【開発環境】
OS:Win11(64ビット)
VSCode1.72.2、
クロム

【正規表現における先読みと後読みとは】
先読み(肯定先読み、否定先読み)と後読み(肯定後読み、否定後読み)の書式は次の通りです。

パターンA(?=パターンB)     肯定先読み
パターンA(?!パターンB)     否定先読み
(?<=パターンB)パターンA    肯定後読み
(?<!パターンB)パターンA    否定後読み

先読みの場合→パターン A の直後にパターン B が続く場合(または続かない場合)にマッチする。
後読みの場合→ パターン A の直前にパターン B がある場合(またはない場合)にマッチします。
どちらもパターン B も含めてマッチするかどうか判断しますが、マッチした文字列として取得するのはパターン A にマッチした部分だけです。

【肯定の先読み】

肯定の先読みは、対象の文字列がパターン A の直後にパターン B に続く場合にマッチします。この時、マッチした値としてはパターン A にマッチした部分だけを取得します。

パターンA(?=パターンB)     肯定先読み

サンプル

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 にマッチした部分だけを取得します。

(?<=パターン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 にマッチした部分だけを取得します。

(?<!パターン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

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 息子介護物語-エピソード66(... | トップ | JS--パターンのフラグ »
最新の画像もっと見る

コメントを投稿

JavaScript」カテゴリの最新記事