今回は、正規表現で使用出来るメソッドについてご紹介させて頂きます。
フラグと組み合わせて使うことにより、様々なパターンの結果を得ることが出来ますので、それぞれの違いをしっかりと学んでおきましょう。
exec メソッド
基本
「exec()」は、指定された文字列内で一致するものを取得します。
regexp.exec(文字列)
let reg1 = /19\d{2}-\d{2}-\d{2}/; let newReg = reg1.exec('My birthday is 1991-01-01'); console.log(newReg[0]); 1991-01-01
パターンにマッチした配列が返されています。
let sample = new RegExp(/20\d{2}-\d{2}-\d{2}/); let reg1 = sample.exec('Today is 2022-05-05'); console.log(reg1[0]); 2022-05-05
「RegExp」を使うとこのようなコードになります。
キャプチャグループ
パターンの中の一部を、「()」で囲ったグループを「キャプチャグループ」と言います。
execメソッドを例に見てみましょう。
let reg1 = /(19\d{2})-(\d{2})-(\d{2})/; let newReg = reg1.exec('My birthday is 1991-01-01'); console.log('キャプチャ0 : ' + newReg[0]); console.log('キャプチャ1 : ' + newReg[1]); console.log('キャプチャ2 : ' + newReg[2]); console.log('キャプチャ3 : ' + newReg[3]); キャプチャ0 : 1991-01-01 キャプチャ1 : 1991 キャプチャ2 : 01 キャプチャ3 : 01
配列のインデックスの番号と、実際のコードの場所を確認してください。
let reg1 = /(?<year>19\d{2})-(?<month>\d{2})-(?<day>\d{2})/; let newReg = reg1.exec('My birthday is 1991-01-01'); let year = newReg.groups.year; let month = newReg.groups.month; let day = newReg.groups.day; console.log(year + '年' + month + '月' + day + '日'); 1991年01月01日
キャプチャーグループには名前を付けることが出来ます。
「(?<>)」の形で記述します。
execメソッドは、「gフラグ」を使わない限り、下でご紹介する、matchメソッドと同じ動作をします。
test メソッド
testメソッドは、前回ご紹介しておりますが、改めて以下をご確認ください。
let fruits = '私はぶどうといちごが大好きです。'; let reg1 = /ぶどう/; let reg2 = new RegExp('いちご'); let reg3 = new RegExp(/みかん/); console.log(reg1.test(fruits)); console.log(reg2.test(fruits)); console.log(reg3.test(fruits)); true true false
マッチする場合は、「true」を、マッチしない場合は「false」を返します。
match メソッド
基本
matchメソッドは、マッチした文字列を取得します。
let reg = /19\d{2}-\d{2}-\d{2}/; let str1 = 'My birthday is 1980-02-02'; let str2 = str1.match(reg); console.log(str2[0]); 1980-02-02
マッチしたものと追加のプロパティ、「index」と「input」を持つ配列です。
let sample = '私はフルーツの中で、バナナとりんごが大好きです。'; let resulet = sample.match(/フルーツ/); console.log(resulet[0]); フルーツ console.log(resulet.index); 2 console.log(resulet.input); 私はフルーツの中で、バナナとりんごが大好きです。
gフラグ
gフラグを設定すると、マッチしたすべての文字列の配列を返します。
プロパティはありません。
let hell = 'HELLO - Hello - hello'; let result1 = hell.match(/hello/); console.log(result1); ['hello', index: 16, input: 'HELLO - Hello - hello']
gフラグがない場合です。
let hell = 'HELLO - Hello - hello'; let result3 = hell.match(/hello/ig); console.log(result3); ['HELLO', 'Hello', 'hello'] 0: "HELLO" 1: "Hello" 2: "hello" length: 3
gフラグと大文字小文字の区別をしないiフラグを一緒に設定しています。
マッチした文字列の配列が返されています。
マッチした文字列の情報を取得するには、「execメソッド」を使います。
let hell = 'HELLO - Hello - hello'; let reg = /hello/ig; let regMatch1 = reg.exec(hell); console.log(regmatch1); ['HELLO', index: 0, input: 'HELLO - Hello - hello', groups: undefined] let regMatch2 = reg.exec(hell); console.log(regMatch2); ['Hello', index: 8, input: 'HELLO - Hello - hello', groups: undefined] let regMatch3 = reg.exec(hell); console.log(regMatch3); ['hello', index: 16, input: 'HELLO - Hello - hello', groups: undefined]
search メソッド
searchメソッドは、マッチした最初の文字のインデックスを返します。
let hell = 'HELLO - Hello - hello'; console.log(hell.search(/h/)); 16
最初の「h」のインデックスを返しています。
let hell = 'HELLO - Hello - hello'; console.log(hell.search(/h/i)); 0
iフラグを設定すると最初の「H」、「0」を返します。
split
splitメソッドは、指定の文字で文字列を分割します。
let split = '090-1234-5678'; console.log(split.split(/-/)); (3) ['090', '1234', '5678']
「-」で文字列を区切っています。
なお、すでに学習した文字列メソッドの「split関数」でも同じ結果を得ることが出来ますが、正規表現を使用した方が、幅広い分割の方法に対応することが出来ます。
console.log(split.split('-')); (3) ['090', '1234', '5678']
replace メソッド
基本
replaceメソッドは、指定した文字列を置換することが出来ます。
replace(置換する文字列, 新しい文字列)
let split = '090-1234-5678'; console.log(split.replace('090', '080')); 080-1234-5678
「090」を「080」に置換しています。
置換する文字列に正規表現を指定することも出来ます。
console.log(split.replace(/-/g, '')); 09012345678
「-」を削除しています。
置換のための文字列
正規表現を使って置換する場合に、特別な文字列を使用することが出来ます。
記号 | 意味 |
---|---|
$$ | $ |
$& | マッチした文字列 |
$` | マッチした文字列の 前の文字列 |
$’ | マッチした文字列の 後の文字列 |
$n | キャプチャーグループの番号をnに指定 |
let play = 'I play tennis. I play basketball. I play swimming.'; console.log(play.replace(/I/g, 'You and $&')); You and I play tennis. You and I play basketball. You and I play swimming.
あとがき
沢山のメソッドを簡単にご紹介させて頂きましたが、実際に使用する際は、もう少し複雑な組み合わせで使用することが多いと思います。
初めて学習される方は、とにかく基本的な使い方をしっかりと抑えておきましょう。
今回も最後までお読み頂きありがとうございました。