14

Javascript正規表現は、最初は正常に機能しますが、2回目は正常に機能しません.3回目は正常に機能し、4回目は機能しません.

脚本 :

<script language="javascript" type="text/javascript">
    var reg = /[^\w]/gi;
    function checkNonWordChars() {
        var str = $("#TestTextbox").val();
        if (reg.test(str)) {
            alert('!!! Non-Word Char Exists !!!');
        }
        else {
            alert('input accepted');
        }
    }    
</script>

HTML :

<input type="text" id="TestTextbox"  />
<input type="button" value="Test" onclick="checkNonWordChars();" />

ボタンを 1 回クリックすると、「!!!」というアラートが表示されます。非単語文字が存在します!!!」しかし、もう一度クリックすると、「入力が受け入れられました」というアラートが表示されます:(

4

4 に答える 4

16

gモディファイヤを使用すると、エンジンがその状態を記憶するようになるという事実と関係があるのではないかと思います。

修飾子を削除してみてくださいg。とにかく必要ありません。エンジンは常に文字列全体で一致を見つけようとします。したがって、g修飾子は関数と組み合わせて実際には何もしませんがtest、代わりに使用されmatchます。iちなみに、修飾子 も必要ありません\w。小文字と大文字の両方が含まれているからです。

最後にもう 1 つ。正規表現は便利なものを提供しますが、\Wこれは反対\wであり、したがって と同等[^\w]です。

于 2012-11-05T14:07:39.833 に答える
7

オプション1

リテラル表記ではなくコンストラクタを使用します。

var reg = new RegExp('[^\w]','gi');

2 つの違いについて詳しくは、https ://developer.mozilla.org/en-US/docs/Core_JavaScript_1.5_Guide/Regular_Expressions?redirect=no をご覧ください。

オプション 2

文字列の終わりを$記号でマークします。

var reg = /[^\w$]/gi;

オプション 3

正規表現で "g" フラグを使用している場合は、このexecメソッドを複数回使用して、同じ文字列で連続する一致を見つけることができます。これを行うと、正規表現のプロパティで指定されたsubstringofから検索が開始されます ( lastIndex プロパティも進みます)。strlastIndextest

ソース: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp/exec

したがって、あなたの場合、テストは 1 回目、3 回目、5 回目、... の時間だけ機能します。

Firefox 3 にのみフラグがありy、指定された場合はexec常に 0 から始まりますlastIndexが、これはおそらくあなたの場合には役に立ちません。

gフラグを削除できます。

于 2012-11-05T14:27:08.373 に答える
1

RegExp オブジェクトは、私たちが考えているほどステートレスではないようです。簡単な修正は、メソッドvar reg = /[^\w]/gi;内に移動することですcheckNonWordChars()

よろしくお願いします、

于 2012-11-05T14:11:36.727 に答える
0

その正規表現をグローバルにする必要がある場合は、次のように変更します。

var reg = /[^\w]/

それは同様に機能しますが、バグはありません! いたずらな文字のインスタンスを 1 つだけチェックする必要があり、単語以外の文字の大文字と小文字を区別する必要がないため、速度も向上します。

于 2012-11-05T14:29:39.633 に答える