2012-11-05 66 views
9

Javascript正則表達式第一次正常工作,但不是第二次,第三次再次工作,而不是第四次等等:(Javascript正則表達式第一次正常工作,但不是第二次,第三次再次工作,而不是第四次,等等

腳本:

<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();" /> 

如果我的按鈕點擊一次,就會觸發警報說,「!!!非Word字符存在s !!!「但是如果我再次點擊它,它會觸發一條提示說」輸入接受「:(

+1

你在該文本框上有模糊/更改/焦點處理程序嗎? – jbabey

回答

7

OPTION 1

使用構造函數,而不是文字符號:

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

更多的差異這兩者之間:https://developer.mozilla.org/en-US/docs/Core_JavaScript_1.5_Guide/Regular_Expressions?redirect=no

OPTION 2

標記串用$標誌結束:

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

OPTION 3

如果你的正則表達式使用 「G」 標誌,就可以使用多次使用exec方法在同一個字符串中查找連續匹配。當您這樣做時,搜索開始於substringstr,由正則表達式的lastIndex屬性 (test也將推進lastIndex屬性)指定。

來源:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/RegExp/exec

因此,在你的情況下,測試將只1,第3,第5,......時間。

只有在Firefox 3中有一個標誌y,在指定時exec總是從0開始而不是lastIndex,但這可能對您的情況沒有用處。

您可以刪除g標誌。

+1

選項1工作正常,而不是選項2,不管怎樣感謝您的發佈 –

+0

您在選項2中的正則表達式是錯誤的。你只是將「$」字符添加到字符類,你想'var reg =/[^ \ w] $/gi;'。但無論如何,我認爲這不會是OP想要的,只會檢查字符串中的最後一個字符是否是非單詞字符。 – stema

9

我懷疑它與使用g修飾符makes the engine remember its state的事實有關。

嘗試刪除g修飾符,無論如何您不需要它。引擎總是會嘗試在整個字符串中找到匹配。因此,g修飾符與test函數並沒有真正做任何事情,而是用於match。順便說一句,您也不需要i修飾符,因爲\w包括小寫字母和大寫字母。

還有最後一件事。正則表達式提供了方便的\W,這與\w相反,因此相當於​​。

+0

是的,你是對的,在這種情況下,我不需要'g'或'i',但這只是我正在測試的示例,因爲我的原始正則表達式不工作。我有像'/ [^ ad^0-3 \ $ \ - ]/gi'和其他需要'g'和'i''的正則表達式。 –

+0

@NileshThakkar如果你用'test'使用它們,爲什麼你需要'g '? –

+1

先閱讀我的答案,然後使用構造函數而不是文字符號:'var reg = new RegExp('[^ \ w]','gi');'http://jsfiddle.net/Kmmuy/ – sainiuc

1

看來RegExp對象並不像我們想象的那樣是無狀態的。 速戰速決是移動var reg = /[^\w]/gi;checkNonWordChars()方法內

最好的問候,

+1

是的,它是一個快速修復,但是當我多次使用相同的表達式時是一個壞主意 –

+0

或者,如果表達式在腳本的各個位置使用,並且您不想創建1001 RegExp實例,'reg.compile(reg)'可以工作,雖然'compile'被認爲不合適 –

0

如果你需要有一個全球性的正則表達式,然後將其更改爲:

var reg = /[^\w]/ 

將工作一樣好,但並不是越野車!它也會更快,因爲它只需要檢查淘氣角色的一個實例,並且您不關心具有非單詞字符的字符大小寫。

相關問題