マッチした文字列を取得するには
【開発環境】
OS:Win11(64ビット)
VSCode1.72.2、
クロム
【matchメソッドの使い方】
String オブジェクトの match メソッドは、対象となる文字列が正規表現とマッチした場合に、マッチした文字列を取得します。書式は次の通りです。
文字列.match(正規表現オブジェクト)
文字列が引数に指定した正規表現とマッチした場合
マッチした文字列が格納された配列を返します。
マッチしなかった場合
null を返します。
戻り値の配列には
インデックス 0 の要素にパターン全体にマッチした文字列が、
インデックス 1 以降の要素には設定したキャプチャグループで囲んだパターンにマッチした文字列が格納される。
(キャプチャグループを設定していない場合はインデックス 1 以降の要素は存在しません)。
サンプル
let regexp = /20\d{2}-\d{2}-\d{2}/; let str1 = 'Today is 2020-08-14'; let str2 = 'Yesterday is 1998-12-07'; let result1 = str1.match(regexp); console.log(result1[0]);実行> 2020-08-14 let result2 = str2.match(regexp); console.log(result2[0]);実行 > TypeError: Cannot read property '0' of null
【try~catch】
・文字列が正規表現にマッチした場合
パターン全体がマッチした文字列がインデックス 0 の要素の値として格納された配列として受取る
・マッチしなかった場合
戻り値は null となり、 null に対してインデックス 0 の要素を取得しようとすると TypeError が発生する。
サンプル
let regexp = /20\d{2}-\d{2}-\d{2}/;
let str = 'Yesterday is 1998-12-07';
let result = str.match(regexp);
try{
console.log(result[0]);
} catch(e) {
console.log('Not Match');
}
>> Not Match
【パターンにキャプチャグループが含まれる場合】
パターンにキャプチャグループが含まれている場合
キャプチャグループを作成するには、パターンの中を括弧()で囲います。するとキャプチャグループに設定したパターンの部分にマッチした文字列を取得することが出来る。
・サンプル
let regexp = /(20\d{2})-(\d{2})-(\d{2})/;
let str = 'Today is 2020-08-14';
let result = str.match(regexp);
for (let i = 0 ; i >> i=0, match=2020-08-14
>> i=1, match=2020
>> i=2, match=08
>> i=3, match=14
正規表現にマッチした場合→戻り値として配列を受け取る。
インデックス 0 の要素→パターン全体がマッチした文字列が格納される。
インデックス 1 以降の要素→それぞれキャプチャグループで囲まれたパターンにマッチした文字列が格納されている。
【パターンに名前付きキャプチャグループが含まれる場合】
JavaScript では名前付きキャプチャグループも利用することができます。書式は次の通りです。
(?<グループ名>パターン)
名前のないキャプチャグループの場合、 match メソッドの戻り値である配列に含まれるインデックス 1 以降の要素の値を参照することでキャプチャした文字列を取得することができましたが、名前付きキャプチャグループでキャプチャした文字列は次の書式で参照することができます。
配列.groups.グループ名
サンプル
let regexp = /(?20\d{2})-(?\d{2})-(?\d{2})/;
let str = 'Today is 2020-08-14';
let result = str.match(regexp);
let year = result.groups.year;
let month = result.groups.month;
let day = result.groups.day;
console.log(year + '年' + month + '月' + day + '日');
実行
>2020年08月14
名前付きキャプチャグループのキャプチャ(保存する)をそれぞれ取得し、 1 つの文字列にまとめて出力しました。
できることは名前付きであっても名前がなくても同じですがキャプチャグループの番号で指定するよりもグループ名で指定してキャプチャを取得下方が分かりやすいコードにはなるかと思います。
【マッチした文字列の位置を参照する】
match メソッドを実行して文字列が正規表現にマッチした場合、マッチした文字列の先頭文字のインデックスが戻り値として取得した配列の index プロパティに設定されます。そこで index プロパティを参照することでマッチした文字列の位置を参照することができます。インデックスは対象の文字列の先頭文字が 0 、次の文字が 1 、と続いていきます。
サンプル
let regexp = /20\d{2}-\d{2}-\d{2}/; let str = 'Today is 2020-08-14'; let result = str.match(regexp); console.log(result[0]); > 2020-08-14 console.log(result.index); > 9
【グローバルフラグが設定されている場合】
パターンの最後に g を記述するとグローバルフラグを設定することができます。
/パターン/g
・正規表現にグローバルフラグが設定されている場合
match メソッドを実行すると対象の文字列の中で正規表現がマッチするすべての文字列が格納された配列を返します。
・グローバルフラグが設定されている場合
パターンにキャプチャグループが設定されていてもキャプチャは取得することができません。
サンプル
let regexp = /[A-Z].+?day/g;
let str = 'Sunday Monday Tuesday';
let result = str.match(regexp);
for (let i = 0 ; i > Sunday
> Monday
> Tuesday対象の文字列の中でパターンに一致するすべての文字列を取得することができました。