2015-01-03 4 views
18

JavaScriptのマッチVs execのための説明が必要です。 hereいくつかのいずれかがはJavaScriptのVs execと一致しています

が、最初にすべてのあなたは私の例に見るように、これはそうではありません「グローバル正規表現でのexecをループ内で使用されることを意味している」と述べています。私の例では、グローバル正規表現を持つexecは配列内のすべての一致を返しています!第二に、彼らはString.matchのためにループを通す必要のない全てのマッチを返すと言います!しかし、これも私の例では起こりません。入力文字列を返すだけですか?私は間違っている/間違ったことをしたことがありますか?

var myString = "[22].[44].[33]."; 
var myRegexp = /.*\[(\d*)*\].*\[(\d*)*\].*\[(\d*)*\].*/g; 

var execResult = myRegexp.exec(myString); 
console.log(execResult.length); 
console.log(execResult[1]);// returns 22 and execResult has all of my matches from index 1 to the length of array 


var matchResult = myString.match(myRegexp); 
console.log(matchResult.length); 
console.log(matchResult);// returns just myString which is "[22].[44].[33]."! Why is that? 

答えて

38
  1. string.matchグローバルフラグが使用されていない場合に最初の一致を検索し、実際の試合でそれを返し、テキストが見つかったときのインデックスと実際の入力、

  2. string.matchグローバルフラグが使用されている場合は、すべての一致が返されます。

    var myString = "[22].[44].[33]."; 
    
    console.log(myString.match(/\d+/)); 
    # [ '22', index: 1, input: '[22].[44].[33].' ] 
    console.log(myString.match(/\d+/g)); 
    # [ '22', '44', '33' ] 
    

string.matchregex.execとの間の主な違いは、regexオブジェクトはregex.exec呼に現在の試合の更新されています。一致が検出されるたびは、たとえば、あなたが見ることができるように

var myString = "[22].[44].[33].", myRegexp = /\d+/g, result; 

while (result = myRegexp.exec(myString)) { 
    console.log(result, myRegexp.lastIndex); 
} 

[ '22', index: 1, input: '[22].[44].[33].' ] 3 
[ '44', index: 6, input: '[22].[44].[33].' ] 8 
[ '33', index: 11, input: '[22].[44].[33].' ] 13 

を返します、lastIndexプロパティが更新されます。したがって、exec、またはを使用すると、無限ループに陥るという2つのことを覚えておいてください。あなたがgオプションを使用しない場合はそれ以外の場合は、nullがある場合

  1. は、その後、あなたは常に、最初の試合を取得します。したがって、以下は無限ループに入ります。

    var myString = "[22].[44].[33].", myRegexp = /\d+/, result; 
    
    while (result = myRegexp.exec(myString)) { 
        console.log(result, myRegexp.lastIndex); 
    } 
    
  2. 次の呼び出しで同じ正規表現オブジェクトを使用することを忘れないでください。正規表現オブジェクトは毎回更新されるので、新しいオブジェクトを渡すと、プログラムは無限ループに入ります。

    var myString = "[22].[44].[33].", result; 
    
    while (result = /\d+/g.exec(myString)) { 
        console.log(result); 
    } 
    
0

String.prototype.match()RegExp.prototype.exec()は複数のオカレンスを見つけ、アレイにそれらを返すの両方で類似しています。しかし、execメソッドはより詳細な情報の配列を返します。たとえば、マッチとは異なり、キャプチャグループの複数の発生を見つけることもできます。したがって、キャプチャグループがある場合は、execが不可欠です。 execで作業するときには、リテラル正規表現から呼び出すべきではないことを覚えておいてください。最初に正規表現を変数に代入し、それを使ってexecメソッドを呼び出します。もう1つのことは、マッチするとアイテムの配列内に複数のオカレンスが表示される一方で、execを使用して各オカレンスをキャプチャするために反復処理を行う必要があることです。

照合は非常に簡単です。これは文字列のプロトタイプメソッドなので、文字列にチェーンし、正規表現を引数としてmatchメソッドに渡すだけです。 "test" .match(/ es /)正規表現のリテラル表現は問題なく使用できます。

execの呼び出しは複雑です。私が以前に述べたように、正規表現を以前に何かに割り当てておくのが最善です。 [OK]をあなたがExecの結果はまた、キャプチャグループを含んで見たよう例

var text = '["job name 1","nat 1"],["job name 2","nat 2"],["job name 3","nat 3"]', 
 
    reg = /([^"]+)","([^"]+)/g, 
 
     tm = [], 
 
     te = []; 
 

 
tm = text.match(reg); // tm has result of match 
 
while(te[te.length]=reg.exec(text)); // te has result of exec + an extra null item at the end 
 
te.length--; // te normalized. 
 

 
document.write("<pre>" + JSON.stringify(tm,null,2) + "</pre>\n"); 
 
document.write("<pre>" + JSON.stringify(te,null,2) + "</pre>\n");

を見ることができます。私がte配列に値を設定する方法はやや正式ではありませんが、私はwhileループの条件付き部分にちょうどtemp配列を使うのは嫌です。これは私にははるかにきれいに見えます。唯一のことは、whileループを終了させる最後のnullがte配列の最後に挿入されることです。したがって、次のte.length--命令。

+1

''キャプチャグループを持っていれば、execは必須です」と誤解していると思います。なぜなら、 '.match()'は指定されたすべてのキャプチャされたグループの配列を返します。あなたは最初の文章で多くを暗示しています。そして、あなたは明らかにそれぞれの仕組みを知っています。たぶんあなたは、 "グローバルフラグと' .exec() 'を使用して、再帰的に1つまたは複数のキャプチャグループを適用する必要がある場合は、もっと重要なことを意味するでしょうか? –

関連する問題