如何返回错误的字符?

时间:2016-08-15 12:42:10

标签: javascript jquery

如果字符串包含无效字符,我使用JavaScript进行检查;允许的字符为a-zA-Z0-9-

var str = 'Some string!',
    invalid_characters = [];

if (/^[a-zA-Z0-9-]*$/.test(str) == false) {
  console.log('Invalid characters: ' + invalid_characters.join(', '));
}
else {
  console.log('String is OK.');
}

因此,在上面的例子中,!不正确。如何将这些字符添加到数组invalid_characters(每个字符只有一次没有重复)?感谢。

3 个答案:

答案 0 :(得分:2)

过滤掉不符合您的模式的字符。

var str = 'Some string!!!';

var invalid_characters = str.split('').filter(function(char){
    return !/[a-zA-Z0-9-]/.test(char)
})

// Filtering out duplicates
invalid_characters = invalid_characters.filter(function(char, pos) {
    return invalid_characters.indexOf(char) == pos;
})

console.log(invalid_characters) //[" ","!"]

答案 1 :(得分:1)

也许不是最好和最简单的解决方案,但它应该有效:)

characters=str.split("");
wrong=[];
characters.forEach(function(character){
    //check if wrong
    if(/^[a-zA-Z0-9-]*$/.test(character) === false){
        //check if duplicate
        if(wrong.indexOf(character)<0){
            wrong.push(character);
        }
    }
});

答案 2 :(得分:1)

以下内容应该为您完成大部分工作。

var str = 'Some! string! £';

var matches = str.match(/[^a-zA-Z0-9-]{1}/g);
if (matches) {
  var invalid_characters = matches.filter(function(char, pos) {
    return matches.indexOf(char) == pos;
  });
  console.log('Invalid characters: "' + invalid_characters + '"');
} else {
  console.log('String is OK.');
}

JS小提琴here

这基本上是你的正则表达式模式的反转,应用了全局正则表达式标志(以确保match()获取所有匹配)。

我没有添加任何重复数据删除代码,因为有些库可以执行此操作,例如underscorelodashthe answer to this question。我也很喜欢Jeremy在这个帖子中的回复。

编辑:我根据Jeremy的回答添加了重复数据删除,因为它非常简洁。通常我会在underscore docs here

的数组周围包裹_.uniq()