2016-08-30 11 views
-2

は、次のコードを想定します。.match意図したとおりに動作していない

"ab00ab____ab01ab".match(/ab(.+)ab/); 

を私はこれが私に0001を取得したいが、代わりにそれは私にこの返します

["ab00ab____ab01ab", "00ab____ab01"] 

どのようにすることができますがこの問題を解決しますか?

+0

[このスレッドのように](http://stackoverflow.com/questions/39200657/how-do-you-match-valid-integers-and-roman-numerals-with-a-regular-expression?noredirect= 1#comment65741443_39200657)、キャプチャグループにアクセスするだけでは現在の問題が修正されておらず、質問は[* JavaScript正規表現とキャプチャグループ*](http://stackoverflow.com/questions/)で閉じることはできません。 33621271/javascript-regular-expression-and-capture-groups)を参照してください。 –

+0

私の答えは問題を解決しましたか? –

答えて

1

使用RegExp#exec/ab(.+?)ab/g正規表現とループの内側:すべての

var s = "ab00ab____ab01ab"; 
 
var re = /ab(.+?)ab/g; 
 
var res = []; 
 
while ((m=re.exec(s)) !== null) { 
 
    res.push(m[1]); 
 
} 
 
console.log(res);

まず、最初abに一致する怠惰なドットマッチングパターン(.*?または.+?)が必要です最後のabまで一致する欲張りなもの(.+)ではありません。また、String#matchとグローバル修飾子付きの正規表現では、すべてのキャプチャ(カッコで囲まれた正規表現パターン部分に一致する部分文字列)を失いますが、それらはRegExp#execでしか持てません。

+0

コードが壊れていますが、whileループは終了しません。 –

+0

@MarioAlexandroSantini:私の正規表現が空の文字列と一致しないので、間違っています。成功した各マッチの後、 'RegExp'クラスの' lastIndex'プロパティは自動的に進められます。一致がない場合、 'm'は* null *です。 –

+0

空の文字列がある場合は問題になりません。この場合、その間はスキップします。私は* re.exec()*が無限ループの結果として常に一致していると考えていました。とにかく、無限ループを持つ正規表現から* g *フラグを削除したように、コードは危険です。 –

関連する問題