2010-01-06 131 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); 
}