次のスクリプトを使用して、単語の複数回の出現を検出しようとしましたblue
が、単に出力されe
ます。何故ですか ?
var reg_5 = /[blue]+/g;
var str = "Sky was dark and the mood was blue.Sky was dark but the water felt blue.";
document.write("<br / >" + reg_5.exec(str));
次のスクリプトを使用して、単語の複数回の出現を検出しようとしましたblue
が、単に出力されe
ます。何故ですか ?
var reg_5 = /[blue]+/g;
var str = "Sky was dark and the mood was blue.Sky was dark but the water felt blue.";
document.write("<br / >" + reg_5.exec(str));
正規表現が間違っています。b、l、u、または e のいずれかが 1 回以上出現するかどうかを検索します。
あなたの正規表現は次のようになります。
/blue/g
次に、ループを使用します。
var finder = /blue/g;
var result;
while( ( result = finder.exec( str ) ) ){
console.log( result );
}
結果がnullになる限り、正規表現を実行する必要があります。g フラグがないと、このようには機能しません。ファインダーには、最後の一致のインデックスを示す lastIndex プロパティがあるため、正規表現を再作成せずに再利用したい場合は、このプロパティをゼロに戻してください。
文字クラスを失う
var reg_5 = /blue/g;
e
inの最初の一致は/[blue]+/g;
in でstr
あるため、出力e
されthe
ます。その理由と正規表現がどうあるべきかについては、フィリップの回答を参照してください。
グローバルに一致する場合、つまり複数の一致を探している場合で、かつ capture groups を使用していない場合は、 を使用してすべての一致の配列を取得()
できます。match
var m = str.match( /blue/g );
var n = m == null ? 0 : m.length;
console.log( 'The word "blue" appeared ' + n + ' times.' );