我知道这很简单。但我不能让它发挥作用。
请求:包含至少一个数字,字母(可以是两种情况)和至少一个符号(特殊字符)的单词。
在c#(?=。 [0-9])(?=。 [a-zA-z])(?=。* [!@#$%_])工作。但在JavaScript中它不起作用。 似乎它总是在开始时查找数字,因为我的条件以regexp.f中的数字开头
任何人都可以给我一个可以在javascript中使用的正则表达式吗?
-Rakesh
答案 0 :(得分:2)
JavaScript确实支持前瞻。但是,您的群组希望在数字和字母之前至少有字符(因为它们只是以点.
开头)。尝试为这两个点添加*
:
var pattern = /(?=.*[0-9])(?=.*[a-zA-z])(?=.*[!@#$%_])/;
pattern.test('xxx'); // false
pattern.test('111'); // false
pattern.test('!!!'); // false
pattern.test('x1!'); // true
我也在C#中看到了这个正则表达式的同样问题。
答案 1 :(得分:1)
为了涵盖明显的答案,考虑到所述的要求,我会使用单独的测试。
/[0-9]/.test(string) && /[a-z]/i.test(string) && /[!@#$%_]/.test(string)
如果你有兴趣抽象出来,一种方法是将测试存储在一个数组中。
var tests = [ /[0-9]/, /[a-z]/i, /[!@#$%_]/ ];
在不修改周围代码范围的情况下评估多个测试的一种方法,只需将其置于闭包中即可。
var passes = (function(){
for (var i=0; i<tests.length; i++)
if (!tests[i].test(string)) return false;
return true;
})();
答案 2 :(得分:0)
我认为javascript不支持这些前瞻。尝试
/(.*[a-zA-Z].*[0-9].*[!@#$%_].*|.*[a-zA-Z].*[!@#$%_].*[0-9].*|.*[0-9].*[a-zA-Z].*[!@#$%_].*|.*[!@#$%_].*[a-zA-Z].*[0-9].*|.*[0-9].*[!@#$%_].*[a-zA-Z].*|.*[!@#$%_].*[0-9].*[a-zA-Z].*)/
不要期待任何优雅点......
编辑:正如bdukes指出的,js确实支持前瞻。但是,这个(丑陋的)表达确实有用。
答案 3 :(得分:0)
你可以有一个非常长的reg exp,三个字符类以不同的顺序重复,或者使用多个测试 -
function teststring(s){
return /^[\da-zA-Z!@#$%_]+$/.test(s) &&
/\d/.test(s) && /[a-zA-Z]/.test(s) && /[!@#$%_]/.test(s);
}