定期的なトラップ

文字列に少なくとも1桁あることを正規表現で確認するとします。 コードを書きます:



<script>



var digits = /([0-9])+/g;



function has_digit(s) { return digits.test(s); }



</script>









このコードは無効です。

あなたには明らかです-なぜですか? そうでない場合は、katへようこそ!







ところで、自分の目で確かめてください:



<script>



document.write(has_digit("abc0xyz") + ' ' + has_digit("abc0xyz"));



</script>









取得するもの:



真偽



そしてもちろん、彼らはそうすべきです:



true true



has_digit()関数は、間違った答えを定期的に出します。 Webのグローバルな考え方を見てみましょう。



http://javascript.ru



文字列が正規表現の正規表現に一致するかどうかを簡単に調べるには、regexp.test(string)を使用します。



2つ目は、答えが間違っています。



http://www.regular-expressions.info



RegExpオブジェクトのtest()関数は、exec()!= Nullへのショートカットです。 サブジェクト文字列をパラメータとして受け取り、正規表現が文字列の一部に一致するかどうかに応じてtrueまたはfalseを返します。



2つ目は、答えが間違っています。







長い話は短い。 標準を読みます。



RegExp.prototype.test(文字列)

式RegExp.prototype.exec(string)!= Nullと同等です。





そのため、ポイントはRegExp.prototype.exec(文字列)関数の魔法の泡にあります。



そのアルゴリズムは次のとおりです。正規表現にgフラグがある場合、一致の検索はlastIndexプロパティから始まります(これは正規表現プロパティです)。 最初はゼロに等しいが、検索が成功すると、 次の一致を検索する位置によって更新される。



これが解決策です。 グローバルな正規表現の場合、test()関数は必ずしも行の先頭から一致探すとは限りません。



この問題は、通常、正規表現が次の形式で使用されるという事実によって悪化します。



/([0-9])+/g.test("abc")









このコードは問題を引き起こしません。 なんで? このコードが実行されるたびに、新しい正規表現が作成され、ゼロ位置から検索が開始されることが簡単にわかります。



もちろん、このレーキを踏んだのは私が初めてではありませんでした。



http://stackoverflow.com



驚くべきことに、JavaScriptネットワークリソースのほとんどは役に立たなかった。



誰かがこの貴重な時間を節約してくれることを願っています...



UDP



はい、この場合、グローバルフラグは必要ありません。



もう一度-何が間違っているのかを理解したら-あなたはカットの下に行くことさえできなかった:-)






All Articles