文字列に少なくとも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 truehas_digit()関数は、間違った答えを
定期的に出します。 Webの
グローバルな考え方を見てみましょう。
http://javascript.ru文字列が正規表現の正規表現に一致するかどうかを簡単に調べるには、regexp.test(string)を使用します。2つ目は、答えが間違っています。
http://www.regular-expressions.infoRegExpオブジェクトの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はい、この場合、グローバルフラグは必要ありません。
もう一度-何が間違っているのかを理解したら-あなたはカットの下に行くことさえできなかった:-)