String.match()とRegExp.exec()

4620 ワード

最近は「javascript権威ガイド」の正則部分を見ました.matchとexecの方法には同じ点と違う点があります.ここに書いて印象を深めてください.
1.この2つの方法は、マッチングに成功したら、1つの配列を返し、マッチングに失敗したら、nullを返します.
2.RegExpのglobal属性がfalseの場合、この2つの方法の戻り行列は同じです.
配列の0番目の要素は全体のpatternの最初の整合文字列であり、次の要素はpatternの最初の整合の中のサブマッチング文字列である.
また、配列にはindexとinputの2つの追加属性があり、indexはマッチング文字列の開始位置であり、inputは入力文字列全体である.
このとき、RegExpのlastIndex属性は常に0です.
デモ:
    var s = 'this is a string';

    var p = /\b\w*(i)s\b/;

    var rm = s.match(p);

    var re = p.exec(s);

    console.log('match_array: ' + JSON.stringify(rm));

    console.log('match_array_index: ' + rm.index);

    console.log('match_array_input: ' + rm.input);

    console.log('----------------------------');

    console.log('exec_array: ' + JSON.stringify(re));

    console.log('exec_array_index: ' + re.index);

    console.log('exec_array_input: ' + re.input);
表示結果は(firefoxコンソール):
match_array: ["this","i"]



match_array_index: 0



match_array_input: this is a string



----------------------------



exec_array: ["this","i"]



exec_array_index: 0



exec_array_input: this is a string
3.RegExpのglobal属性がtrueの場合、戻る配列は異なる.
match法で返された配列は、サブマッチ文字列と追加の属性がないすべてのマッチ文字列を含んでいます.このとき、lastIndex属性は無効です.
execメソッドが返した配列フォーマットはglobalがfalseの場合と同じですが、RegExpのlastIndex属性は有効です.マッチングはlastIndexから指示された文字から始まります.方法実行後にlastIndexを今回のマッチ文字列の次の文字に置くので、ループに沿ってexec方法を実行する時に文字列全体に順次一致します.文字列は最後にnullに戻ります.また、lastIndexを0にセットします.
デモ:
    var s = 'this is a string';

    var p = /\b\w*(i)s\b/g;

    var rm = s.match(p);

    var re;

    console.log('match_array: ' + JSON.stringify(rm));

    console.log('match_array_index: ' + rm.index);

    console.log('match_array_input: ' + rm.input);

    while(re = p.exec(s)){

        console.log('----------------------------');

        console.log('exec_array: ' + JSON.stringify(re));

        console.log('exec_array_index: ' + re.index);

        console.log('exec_array_input: ' + re.input);

        console.log('regexp_lastIndex: ' + p.lastIndex);

    }

    console.log('----------------------------');

    console.log('exec_array: ' + re);

    console.log('regexp_lastIndex: ' + p.lastIndex);
結果:
match_array: ["this","is"]



match_array_index: undefined



match_array_input: undefined



----------------------------



exec_array: ["this","i"]



exec_array_index: 0



exec_array_input: this is a string



regexp_lastIndex: 4



----------------------------



exec_array: ["is","i"]



exec_array_index: 5



exec_array_input: this is a string



regexp_lastIndex: 7
----------------------------



exec_array: null
regexp_lastIndex: 0
以上より:
  • g識別子がない場合、matchとexec方法の効果は同じです.g識別子がある場合、exec方法は最も完全なマッチング結果を提供することができる.
  • ここではついでにRegExp.test()の方法を紹介します.exec方法の簡略版です.マッチング結果があればtrueに戻ります.マッチング結果がなければfalseに戻ります.実行過程はexecと同じです.相当于(p.exec(s)=null).
  • RegExpのlastIndex属性はg識別子があり、execおよびtest方法で有効であり、他のところでは無効である.