我正在研究一个简单的密码验证器,并想知道它是否可能在Regex或...除了单独检查每个字符之外还有什么。
基本上如果用户键入类似“aaaaaaaaa1aaaaa”的内容,我想让用户知道不允许使用字符“1”(这是一个非常简单的例子)。
我试图避免像
这样的事情if(value.indexOf('@') {}
if(value.indexOf('#') {}
if(value.indexOf('\') {}
可能是这样的:
if(/[^A-Za-z0-9]/.exec(value) {}
任何帮助?
答案 0 :(得分:5)
如果您只是想检查字符串是否有效,可以使用RegExp.test()
- 这比exec()
更有效,因为它会在找到第一个匹配项时返回true:
var value = "abc$de%f";
// checks if value contains any invalid character
if(/[^A-Za-z0-9]/.test(value)) {
alert('invalid');
}

如果您想要选择哪些字符无效,则需要使用String.match()
:
var value = "abc$de%f";
var invalidChars = value.match(/[^A-Za-z0-9]/g);
alert('The following characters are invalid: ' + invalidChars.join(''));

答案 1 :(得分:3)
虽然一个简单的循环可以完成这项工作,但这是使用鲜为人知的Array.prototype.some
方法的另一种方法。来自MDN's description of some:
some()方法测试数组中的某个元素是否通过了由提供的函数实现的测试。
优于循环的优点是,一旦测试结果为肯定,它就会停止通过数组,从而避免使用break
。
var invalidChars = ['@', '#', '\\'];
var input = "test#";
function contains(e) {
return input.indexOf(e) > -1;
}
console.log(invalidChars.some(contains)); // true
答案 2 :(得分:2)
我建议:
function isValid (val) {
// a simple regular expression to express that the string must be, from start (^)
// to end ($) a sequence of one or more letters, a-z ([a-z]+), of upper-, or lower-,
// case (i):
var valid = /^[a-z]+$/i;
// returning a Boolean (true/false) of whether the passed-string matches the
// regular expression:
return valid.test(val);
}
console.log(isValid ('abcdef') ); // true
console.log(isValid ('abc1def') ); // false
否则,要显示字符串中找不到的字符,不允许:
function isValid(val) {
// caching the valid characters ([a-z]), which can be present multiple times in
// the string (g), and upper or lower case (i):
var valid = /[a-z]/gi;
// if replacing the valid characters with zero-length strings reduces the string to
// a length of zero (the assessment is true), then no invalid characters could
// be present and we return true; otherwise, if the evaluation is false
// we replace the valid characters by zero-length strings, then split the string
// between characters (split('')) to form an array and return that array:
return val.replace(valid, '').length === 0 ? true : val.replace(valid, '').split('');
}
console.log(isValid('abcdef')); // true
console.log(isValid('abc1de@f')); // ["1", "@"]
参考文献:
答案 3 :(得分:0)
如果我理解您的要求,您可以执行以下操作:
function getInvalidChars() {
var badChars = {
'@' : true,
'/' : true,
'<' : true,
'>' : true
}
var invalidChars = [];
for (var i=0,x = inputString.length; i < x; i++) {
if (badChars[inputString[i]]) invalidChars.push(inputString[i]);
}
return invalidChars;
}
var inputString = 'im/b@d:strin>';
var badCharactersInString = getInvalidChars(inputString);
if (badCharactersInString.length) {
document.write("bad characters in string: " + badCharactersInString.join(','));
}
&#13;