2010-01-06 133 views
0

我知道這是一件簡單的事情。但我不能讓它工作。正則表達式 - javascript

Req:包含至少一個數字,字母(可以是兩種情況)和至少一個符號(特殊字符)的單詞。 (?=。[0-9])(?=。 [a-zA-z])(?=。* [!@#$%_])工作。但在JavaScript中不起作用。 似乎它總是在開始尋找數字,因爲我的狀態以regexp.f中的數字開頭

任何人都可以給我一個可用於javascript的正則表達式嗎?

-Rakesh

+2

向我們展示你的JavaScript代碼。 – 2010-01-06 18:17:52

+0

超級有用+用於調試正則表達式的免費工具:http://weitz.de/regex-coach/ – Seth 2010-01-06 18:19:30

回答

0

我不認爲JavaScript支持這些lookaheads。嘗試

/(.*[a-zA-Z].*[0-9].*[[email protected]#$%_].*|.*[a-zA-Z].*[[email protected]#$%_].*[0-9].*|.*[0-9].*[a-zA-Z].*[[email protected]#$%_].*|.*[[email protected]#$%_].*[a-zA-Z].*[0-9].*|.*[0-9].*[[email protected]#$%_].*[a-zA-Z].*|.*[[email protected]#$%_].*[0-9].*[a-zA-Z].*)/ 

不奢望任何點優雅...

編輯:作爲bdukes指出,JS不支持向前看符號。然而,這個(醜陋的)表達確實起作用。

+0

你欠我一些建議。 – Erik 2010-01-06 18:21:57

+0

哈哈,對不起。當我在喝咖啡之前回答問題時會發生這種情況。 – 2010-01-06 18:31:33

2

JavaScript確實支持lookaheads。但是,您的小組會期望在數字和字母之前至少有一個字符(因爲它們僅以點號.開頭)。嘗試添加*到這兩個點:

var pattern = /(?=.*[0-9])(?=.*[a-zA-z])(?=.*[[email protected]#$%_])/; 
pattern.test('xxx'); // false 
pattern.test('111'); // false 
pattern.test('!!!'); // false 
pattern.test('x1!'); // true 

我看到了同樣的問題,在C#正則表達式,太。

1

只是爲了覆蓋顯而易見的答案,考慮到所述的要求,我會使用單獨的測試。

/[0-9]/.test(string) && /[a-z]/i.test(string) && /[[email protected]#$%_]/.test(string) 

如果您有興趣將這個抽象出來,一種方法是將測試存儲在一個數組中。

var tests = [ /[0-9]/, /[a-z]/i, /[[email protected]#$%_]/ ]; 

還有一種方法來評估多個測試而不修改周圍代碼的範圍,只需將它鎖到閉包中即可。

var passes = (function(){ 
    for (var i=0; i<tests.length; i++) 
     if (!tests[i].test(string)) return false; 
    return true; 
})(); 
0

你可以有一個很長的REG EXP,用三種字符在differtent順序重複,或者使用超過一種測試

function teststring(s){ 
return /^[\[email protected]#$%_]+$/.test(s) && 
/\d/.test(s) && /[a-zA-Z]/.test(s) && /[[email protected]#$%_]/.test(s); 
}