确定字符串是否包含字符列表中没有的字符,如果是,那么哪些字符不匹配?

时间:2015-01-15 22:33:43

标签: javascript regex

我正在研究一个简单的密码验证器,并想知道它是否可能在Regex或...除了单独检查每个字符之外还有什么。

基本上如果用户键入类似“aaaaaaaaa1aaaaa”的内容,我想让用户知道不允许使用字符“1”(这是一个非常简单的例子)。

我试图避免像

这样的事情
if(value.indexOf('@') {}
if(value.indexOf('#') {}
if(value.indexOf('\') {}

可能是这样的:

if(/[^A-Za-z0-9]/.exec(value) {}

任何帮助?

4 个答案:

答案 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;
&#13;
&#13;