2016-08-15 74 views
1

我正在使用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和循環槽 –

回答

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

+0

謝謝,以及如何刪除重複?對於'var str ='一些字符串!!';'它會返回'[「」,「!」,「!」]' – Legionar

+0

@Legionar使用array.indexOf(word)<0檢查字是否已經存在 –

+0

@ Jonasw是的,但在'過濾器'功能裏,它不起作用。 – Legionar

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

這不會返回每個*錯誤的*字符只有一次沒有重複 – Steve

+0

@Steve,哦,我錯過了。 –

+0

@Steve:編輯答案 –

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

這基本上是你的正則表達式的反轉,應用了全球正則表達式標誌(以確保比賽()拿起所有的結果)。

我還沒有包含任何重複數據刪除代碼,因爲有那些庫可以執行此操作,例如underscore,lodashthe answer to this question。我也很喜歡Jeremy在這個主題中的回覆。

編輯:我根據Jeremy的答案添加了重複數據刪除功能,因爲它非常簡潔。通常我會圍繞underscore docs here的數組包裝_.uniq()

+0

謝謝,這也是解決方案。 – Legionar