我正在尝试在JavaScript中创建一个Regex测试,测试字符串以包含以下任何字符:
!$%^&*()_+|~-=`{}[]:";'<>?,./
更多信息如果您有兴趣:)
这是我正在努力的一个非常酷的密码更改应用程序。如果您对此感兴趣,请参阅其余代码。
我有一个列出密码要求的表,并且作为最终用户键入新密码,它将测试一个正则表达式数组并在相应的表行中放置一个复选标记,如果它...检查出:)我只需要添加此项代替validation
数组中的第4项。
var validate = function(password){
valid = true;
var validation = [
RegExp(/[a-z]/).test(password), RegExp(/[A-Z]/).test(password), RegExp(/\d/).test(password),
RegExp(/\W|_/).test(password), !RegExp(/\s/).test(password), !RegExp("12345678").test(password),
!RegExp($('#txtUsername').val()).test(password), !RegExp("cisco").test(password),
!RegExp(/([a-z]|[0-9])\1\1\1/).test(password), (password.length > 7)
]
$.each(validation, function(i){
if(this)
$('.form table tr').eq(i+1).attr('class', 'check');
else{
$('.form table tr').eq(i+1).attr('class', '');
valid = false
}
});
return(valid);
}
是的,还有相应的服务器端验证!
答案 0 :(得分:140)
这个的正则表达式非常简单。只需使用一个字符类。连字符是字符类中的特殊字符,因此它必须是第一个:
/[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]/
您还需要转义其他正则表达式元字符。
修改强> 连字符是特殊的,因为它可用于表示一系列字符。可以使用以下范围简化相同的字符类:
/[$-/:-?{-~!"^_`\[\]]/
有三个范围。 '$'到'/',':'到'?','{'到'〜'。最后一个字符串不能用一个范围更简单地表示:!“^ _`[]。
使用ACSII table查找字符类的范围。
答案 1 :(得分:5)
/[\W\S_]/
这将创建一个字符类,以除去单词字符,空格字符并加回下划线字符(因为下划线是“单词”字符)。剩下的就是特殊字符。大写字母表示它们的小写字母的取反。
\W
将选择与[^a-zA-Z0-9_]
等价的所有非“单词”字符
\S
将选择与[ \t\n\r\f\v]
等价的所有非“空白”字符
_
将选择“ _”,因为我们在使用\W
时将其取反,需要将其重新添加到
答案 2 :(得分:3)
最简单,最短的方法是使用此方法:
/[\W\S]/
这表示:所有不是数字或英文字母(\W
)或空格字符(\S
)的字符。
它可能不像Jeff的解决方案那样完美,但是它要简单得多,我认为它的实用性并不相同。
答案 3 :(得分:0)
(?=\W_)(?=\S).
怎么样?它检查 .
匹配的字符是否不是单词字符(但是 _
是允许的)并且它不是空格。
注意:正如@Casimir et Hippolyte 在另一条评论中指出的那样,这也将匹配 é 等字符。如果您不希望出现这样的字符,那么这是一个可行的解决方案。
答案 4 :(得分:-1)
// The string must contain at least one special character, escaping reserved RegEx characters to avoid conflict
const hasSpecial = password => {
const specialReg = new RegExp(
'^(?=.*[!@#$%^&*"\\[\\]\\{\\}<>/\\(\\)=\\\\\\-_´+`~\\:;,\\.€\\|])',
);
return specialReg.test(password);
};
答案 5 :(得分:-1)
实现此目标的简单方法是否定集[^ \ w \ s]。这基本上抓住了:
由于某些原因[\ W \ S]不能以相同的方式工作,因此不进行任何过滤。 Zael对其中一个答案的评论提供了某种解释。
答案 6 :(得分:-4)
在&#39; A&#39;中替换所有语言的所有后者,如果您希望所有数字都为0:
return str.replace(/[^\s!-@[-`{-~]/g, "A").replace(/\d/g, "0");