2012-02-14 7 views
5

javascriptで正規表現をテストすると、一貫して奇妙な結果が得られているようです。 http://jsfiddle.net/s5fYf/15/Javascript Regexは.test()を渡す必要がありますが、失敗すると思われます - なぜですか?

これは私が構築してるWebプロジェクトから取られる:

は、ここに私のバイオリンです。私はバリデーションオブジェクトの配列を自分の検証関数に渡します。バリデーション関数は、各ルールを値に対して検証します。 falseの場合は、ループを停止し、失敗したルールからメッセージとcssClassを受け取る戻りオブジェクトを返す必要があります。

問題は、正規表現テストに合格しても検証メソッドがfalseを返すように見えますが、これは不可能です。だから、私は何かキーが欠けているように感じる。デバッグ出力から、出力される正規表現テストはパスしますが、コード内でテストされると明らかに失敗します。これは、私が私のプロジェクトで見るものとインラインです。デバッグ出力を省略すると、戻り値は基本的に真と偽の間で切り替わります。

本来、/regex/.test(value)の機能は、真実と偽の間で振動しているように見えますが、これは一貫していますが、私が期待していたものではありません...したがって、私の質問はこの奇妙な行動を引き起こしています!

私は私の正規表現をソリューションの外でテストしました。

UPDATE:私の正規表現から 'G' またはグローバルフラグを省略

は、この問題を解決しました。

Why RegExp with global flag in Javascript give wrong results?

答えて

19

それはjavascriptの正規表現のtest方法が結果を返すという事実に沸く:

完全なグローバルフラグの説明とその落とし穴については、以下の答え、その後、このリンクを参照してください。マッチの後にポインタを移動します。

最初の呼び出しがtrueを返した場合、2番目の呼び出しはfalseを返します。この例をチェックしてください:http://jsfiddle.net/B9aVA/

var regex = /^.+$/g 
var input = "Hello"; 
console.log(regex.test(input)); 
console.log(regex.test(input)); 

true 
false 

を書き込みますので、二回のテストを呼び出してコード:

case "regex": 
    $(".debug-info").append('<span>Result: ' + validation[i].rule.test(value) + '</span><br />'); 
    if (!validation[i].rule.test(value)) 
      returnValue.isValid = false; 
    break; 

私の提案は、一度testを呼び出し、結果を変数に格納することで、その代わりにそれを使用してください

case "regex": 
    var result = validation[i].rule.test(value); 
    $(".debug-info").append('<span>Result: ' + result + '</span><br />'); 
    if (!result) 
      returnValue.isValid = false; 
    break; 

ストーリーの道徳:メソッドは副作用を持つことがあります。それがプロパティと区別されます。

+0

私は 'test()'と戻り値の間に一貫性があります。しかし、ぼかしを複数回トリガーすると、同じオシレーションが発生します。これをどうやって回避しますか? – Jon

+1

問題はグローバルフラグにありますので、上記の私の更新をご覧ください。 – Jon

+0

ありがとう!正規表現から 'g'グローバルフラグを落としたときに、保存された' test() 'の結果の問題はなくなりました。グローバルフラグは追加の正規表現の約20%です。test()呼び出しが有効なときに失敗しました。 –

関連する問題