2017-10-05 3 views
1

グループ内の "/"で始まる数字と一致する必要があります。javascript - regexp exec最初のcharが一致しない場合、内部インデックスが進まない

これを行うために、私は、次の正規表現を作った:

var reg = /(^|[^,\/])([0-9]*\.?[0-9]*)/g; 

最初の部分マッチは2番目の部分は番号と一致し、文字列と「/」を除く他の何かの始まり。すべてが正常に(それは私が必要と一致する)正規表現について動作します。私はhttps://regex101.com/を使ってテストしています。ここでの例:https://regex101.com/r/7UwEUn/1

問題は、文字列の最初の文字が数字でない場合、js(下のスクリプト)で使用すると無限ループになります。近くに見ると、文字列の始まりと一致し続けるように見えますが、それ以上進展することはありません。

var reg = /(^|[^,\/])([0-9]*\.?[0-9]*)/g; 
var text = "a 1 b"; 
while (match = reg.exec(text)) { 
    if (typeof match[2] != 'undefined' && match[2] != '') { 
     numbers.push({'index': match.index + match[1].length, 'value': match[2]}); 
    } 
} 

文字列が数字( "1 a b")で始まる場合、すべて正常です。

ここに問題があるようです(^ | [^、/]) - 削除^ |無限ループで問題を解決しますが、数値で始まる文字列で必要なものと一致しません。

なぜ内部インデックスが進行していないのでしょうか?

答えて

1

あなたの正規表現が空の文字列にマッチする可能性があるため、無限ループが発生します。

var reg = /(^|[^,\/])([0-9]*\.?[0-9]+)/g; 
 
var text = "a 1 b a 2 ana 1/2 are mere (55"; 
 
var numbers=[]; 
 
while (match = reg.exec(text)) { 
 
    numbers.push({'index': match.index + match[1].length, 'value': match[2]}); 
 
} 
 
console.log(numbers);

(注)この正規表現すること:あなたは空の文字列(も、あなたのコードから判断する)必要があるので、それは少なくとも一つの数字を一致させるため、 +で最後 *を交換する可能性はありません 34.のような数字と一致しない場合は、 /(^|[^,\/])([0-9]*\.?[0-9]+|[0-9]*\.)/gを使用してください。 this regex demoを参照してください。

var reg = /(^|[^,\/])([0-9]*\.?[0-9]+)/g; 
 
var text = "a 1 b a 2 ana 1/2 are mere (55"; 
 
var numbers=[]; 
 
while (match = reg.exec(text)) { 
 
    if (match.index === reg.lastIndex) { 
 
     reg.lastIndex++; 
 
    } 
 
    if (match[2]) numbers.push({'index': match.index + match[1].length, 'value': match[2]}); 
 
} 
 
console.log(numbers);

または、手動でマッチしない時に正規表現lastIndexを進め、別の "トリック" を使用することができます

関連する問題