如何返回不正确的字符?

问题描述:

我正在使用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.'); 
} 

所以在上面的exaple,!是不正确的。我怎样才能得到这些字符到invalid_characters(每个字符只有一次没有重复)?谢谢。

+0

str.split和循环槽 –

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

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) //[" ","!"]

+0

谢谢,以及如何删除重复?对于'var str ='一些字符串!!';'它会返回'[“”,“!”,“!”]' – Legionar

+0

@Legionar使用array.indexOf(word)

+0

@ Jonasw是的,但在'过滤器'功能里,它不起作用。 – Legionar

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

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); 
     } 
    } 
}); 
+0

这不会返回每个*错误的*字符只有一次没有重复 – Steve

+0

@Steve,哦,我错过了。 –

+0

@Steve:编辑答案 –

下应该做的大部分工作适合你。

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

这基本上是你的正则表达式的反转,应用了全球正则表达式标志(以确保比赛()拿起所有的结果)。

我还没有包含任何重复数据删除代码,因为有那些库可以执行此操作,例如underscore,lodashthe answer to this question。我也很喜欢Jeremy在这个主题中的回复。

编辑:我根据Jeremy的答案添加了重复数据删除功能,因为它非常简洁。通常我会围绕underscore docs here的数组包装_.uniq()

+0

谢谢,这也是解决方案。 – Legionar