職案人

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

JS--直前の文字を指定回数繰り返すマッチパターン

2024年04月26日 | JavaScript

直前の文字を指定回数繰り返すマッチパターン

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

【直前の文字が0回以上連続する文字にマッチ(*)】
メタ文字のひとつであるアスタリスク(*)は直前の文字が 0 回以上連続する文字列にマッチします( 0 回以上というのは一度もなくてもいいし何回出てもいいという意味です)。

・サンプル

let regexp = /Ha*n/;

console.log(regexp.test('Hn'));
>> true
console.log(regexp.test('Han'));
>> true
console.log(regexp.test('Haaaaan'));
>> true
console.log(regexp.test('HaaUaan'));
>> false

【直前の文字が1回以上連続する文字にマッチする(+)】
メタ文字のひとつであるプラス(+)は直前の文字が 1 回以上連続する文字列にマッチします。

サンプル

let regexp = /Ha+n/;

console.log(regexp.test('Hn'));
>> false
console.log(regexp.test('Han'));
>> true
console.log(regexp.test('Haaaaan'));
>> true
console.log(regexp.test('HaaUaan'));
>> false

【直前の文字が0回または1回現れる文字にマッチする(?)】
メタ文字のひとつであるクエスチョンマーク(?)は直前の文字が 0 回または 1 回現れる文字にマッチします。

サンプル

let regexp = /Ha?n/;

console.log(regexp.test('Hn'));
>> true
console.log(regexp.test('Han'));
>> true
console.log(regexp.test('Haaaaan'));
>> false
console.log(regexp.test('Ham'));
>> false

【直前の文字をnum回繰り返す文字にマッチする({num})】
メタ文字のひとつである {num} は直前の文字を num 回繰り返す文字列にマッチします。

サンプル

let regexp = /Ha{2,4}n/;

console.log(regexp.test('Haan'));
>> true
console.log(regexp.test('Haaaan'));
>> true
console.log(regexp.test('Haaaaan'));//aが5回
>> false
console.log(regexp.test('HaaaO'));//最後がO>> false 

【直前のパターンを繰り返す】
ここまで解説した繰り返しを行うメタ文字は、繰り返しの対象が直前の文字だけでなく直前の別のパターンを繰り返す文字列にもマッチします。

・例文1
任意の文字を表すドット(.)の直後にアスタリスク(*)を記述すると、任意の文字を 0 回以上繰り返す文字列にマッチします。最初にが現れ、そのあとに任意の文字が 0 回以上続き、最後にが現れる文字列にマッチさせることも出来る。

const regexp = /.*<\/p>/;

・例文2
0 から 9 までのいずれかの文字とマッチする文字クラスの [0-9] の直後に {4} を記述すると、任意の数字が 4 回続く文字列にマッチさせることも出来る。

const regexp = /[0-9]{3}-[0-9]{4}/;

サンプル

let regexp1 = /<em>.*<\/em>/;
let str1 = '<p>今日は<em>快晴の</em>一日です</p>';

let result1 = str1.match(regexp1);
console.log(result1[0]);
>> <em>快晴の</em>

let regexp2 = /[0-9]{3}-[0-9]{4}/;
let str2 = '郵便番号は 123-4567 です';

let result2 = str2.match(regexp2);
console.log(result2[0]);
>> 123-4567

【グループ化したパターンを繰り返す】
ここまでは繰り返しの対象が直前の文字やパターンの場合でしたが、複数の文字やパターンを括弧()で囲んでグループ化することで、グループ化した複数の文字やパターンを繰り返す文字列にもマッチさせることができます。

例えば
const regexp = /\d{1,3}\./;
このパターン全体を 3 回繰り返すパターンなので、単に {3} を付け加えるのではなく、対象のパターン全体を括弧()で囲んでグループ化したあとで {3} を記述します。
const regexp = /(\d{1,3}\.){3}/;
これで数値が 1 つから 3 つ続いたあとにドット(.)が続く文字列を 3 回繰り返すパターンが完成です
・サンプル

let regexp = /(\d{1,3}\.){3}\d{1,3}/;
let str = 'IPアドレスは 192.168.0.18 です';

let result = str.match(regexp);
console.log(result[0]);
>> 192.168.0.18

【最大量指定子と最小量指定子】
+ や * などの量指定子はデフォルトではより多い文字列にマッチしようとします。
・サンプル

let regexp = /b.*a/;
let str = 'breakfast is sandwich';

let result = str.match(regexp);
console.log(result[0]);
>> breakfast is sa

このパターンでは b で始まり、任意の文字が 0 回以上続いたあとに a が続く文字列とマッチします。

対象の文字列の中で b のあとに a が現れるのは次の三か所があります。

breakfast is sandwich
breakfast is sandwich
breakfast is sandwich

+ や * などの量指定子を使用した時により少ない文字列にマッチさせる場合は最小量指定子を使用します。それぞれの量指定子のあとにクエスチョンマーク(?)を記述する事

*?
+?
??
{min, max}?


先ほどのサンプルを最小量指定子を使って書き直すと

let regexp = /b.*?a/;
let str = 'breakfast is sandwich';

let result = str.match(regexp);
console.log(result[0]);
>> brea今度のサンプルではマッチする候補の中で一番少ない文字列とマッチしました。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする