[JavaScript] 正規表現とexecとmatch

2015/05/14

こんにちは。きんくまです。

お金の文字列から金額の文字列だけを取り出したいなと思いました。

それで正規表現を調べていたのですが、execの扱い方とかがわからなかったので、調べてみました。

そーすコード

var reg = /(\d+)円/g;
var testDatas = [
    '',
    '円',
    '1234567円',
    '1234円~5678円',
    '12円、34円、56円',
    '12円・34円',
    '12円34円'
];
var testData, result;
for(var i = 0, len = testDatas.length; i < len; i++){
    testData = testDatas[i];
    result = testData.match(reg);
    console.log('i = ', i, ' ==========');
    console.log('match result =', result);
    while((result = reg.exec(testData)) !== null){
        console.log('exec = ', result);
    }
}

出力結果

i =  0  ==========
match result = null

i =  1  ==========
match result = null

i =  2  ==========
match result = ["1234567円"]
exec =  ["1234567円", "1234567", index: 0, input: "1234567円"]

i =  3  ==========
match result = ["1234円", "5678円"]
exec =  ["1234円", "1234", index: 0, input: "1234円~5678円"]
exec =  ["5678円", "5678", index: 6, input: "1234円~5678円"]

i =  4  ==========
match result = ["12円", "34円", "56円"]
exec =  ["12円", "12", index: 0, input: "12円、34円、56円"]
exec =  ["34円", "34", index: 4, input: "12円、34円、56円"]
exec =  ["56円", "56", index: 8, input: "12円、34円、56円"]

i =  5  ==========
match result = ["12円", "34円"]
exec =  ["12円", "12", index: 0, input: "12円・34円"]
exec =  ["34円", "34", index: 4, input: "12円・34円"]

i =  6  ==========
match result = ["12円", "34円"]
exec =  ["12円", "12", index: 0, input: "12円34円"]
exec =  ["34円", "34", index: 3, input: "12円34円"]

globalオプションのgがついたときの扱いについて

String.matchだと、マッチした文字列が配列で全て返ってきます。ただしグループ化したとき「( )をつける」はそれが無視されます。

RegExp.execだと、マッチした文字列ごとに一度メソッドが終了します。
そのとき、結果にはマッチした文字列と、グループ化したデータが入っています。続けてexecを実行すると次のマッチした文字列を検索できます。なので、whileループで検索を続けています。

ということみたいです。グループ化したあとの文字列を取り出したいならexec使った方が良さそう。

参考)
RegExp.prototype.exec()
String.prototype.match()

LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

ページトップへ戻る