回答@WiktorStribiżew建议:
function myValidate(word) {
return (word.length === 1 || /[^A-Z]/i.test(word)) ? true : false;
}
Hello在创建数组期间我有一个函数,它不允许将带有某些字符的单词等添加到数组中
function myValidate(word) {
// No one letter words
if (word.length === 1) {
return true;
}
if (word.indexOf('^') > -1 || word.indexOf('$') > -1) {
return true;
}
return false;
}
这似乎不是正确的解决这个问题的方法,我一直在研究一个可以处理它的正则表达式但是没有成功实现它,尝试了许多努力,如:
if (word.match('/[^A-Za-z]+/g') ) {
return true;
}
有人可以说明处理这个问题的正确方法吗?
答案 0 :(得分:1)
我建议使用更简单的解决方案:
function myValidate(word) {
return (word.length === 1 || /[^A-Z]/i.test(word)) ? false : true;
}
var words = ["Fat", "Gnat", "x3-2741996", "1996", "user[50]", "definitions(edit)", "synopsis)"];
document.body.innerHTML = JSON.stringify(words.filter(x => myValidate(x)));
其中:
word.length === 1
检查字符串长度/[^A-Z]/i.test(word)
检查字符串如果满足上述任何条件,则从数组中取出该单词。剩下的就是。
答案 1 :(得分:0)
编辑:使用test
代替match
你想使用test()
,因为它会返回一个bool,告诉你是否匹配正则表达式。相反,match()
始终返回匹配的元素。这些可以通过强制施放到true
。这不是你想要的。
总结一下,你可以使用这个单行(不需要if
也没有引号,也不能更简单):
return word.test(/^[a-zA-Z][a-zA-Z]+$/); // two letter words
您应该将字符列入白名单而不是列入黑名单。这是安全原则之一。在你的情况下,不要告诉什么是错的,但要告诉你什么是正确的:
if (word.test('/^[a-zA-Z]+$/')) { // two letter words
return false;
}
对于包含[a-zA-Z]
个字符的所有单词,这将返回false。我想这就是你想要的。
相反,您的正则表达式通过使用前导^
否定字符组来查找非法字符。
两条建议:
只要以积极的方式使用正则表达式(没有否定),它就会更容易理解。
此外,验证功能通常会返回true
表示正常数据,false
表示错误数据。
这种方式更具可读性:
if (validate(data))
{
// that's some good data we have here!
}