は、次のコードを想定します。.match意図したとおりに動作していない
"ab00ab____ab01ab".match(/ab(.+)ab/);
を私はこれが私に00
と01
を取得したいが、代わりにそれは私にこの返します
["ab00ab____ab01ab", "00ab____ab01"]
どのようにすることができますがこの問題を解決しますか?
は、次のコードを想定します。.match意図したとおりに動作していない
"ab00ab____ab01ab".match(/ab(.+)ab/);
を私はこれが私に00
と01
を取得したいが、代わりにそれは私にこの返します
["ab00ab____ab01ab", "00ab____ab01"]
どのようにすることができますがこの問題を解決しますか?
使用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
でしか持てません。
コードが壊れていますが、whileループは終了しません。 –
@MarioAlexandroSantini:私の正規表現が空の文字列と一致しないので、間違っています。成功した各マッチの後、 'RegExp'クラスの' lastIndex'プロパティは自動的に進められます。一致がない場合、 'm'は* null *です。 –
空の文字列がある場合は問題になりません。この場合、その間はスキップします。私は* re.exec()*が無限ループの結果として常に一致していると考えていました。とにかく、無限ループを持つ正規表現から* g *フラグを削除したように、コードは危険です。 –
[このスレッドのように](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)を参照してください。 –
私の答えは問題を解決しましたか? –