匹配正则表达式中的特殊字符和字母

Kha*_*eel 31 javascript regex special-characters

我正在尝试验证字符串,该字符串应仅包含字母数字和特殊字符&-._.为此我尝试了正则表达式.

var pattern = /[a-zA-Z0-9&_\.-]/
var qry = 'abc&*';
if(qry.match(pattern)) {
    alert('valid');
}
else{
    alert('invalid');
}
Run Code Online (Sandbox Code Playgroud)

使用上面的代码时,字符串abc&*是有效的.但我的要求是显示这个无效.即每当字母,数字或特殊字符以外的字符&-._出现时,字符串应评估为无效.我怎么能用正则表达式做到这一点?

Hig*_*lar 51

将它们添加到允许的字符,但你需要转义它们中的一些,例如 - ]/\

var pattern = /^[a-zA-Z0-9!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]*$/
Run Code Online (Sandbox Code Playgroud)

这样您就可以删除任何想要禁用的角色.

此外,您希望包含字符串placemarkers的开头和结尾^和$

更新:

正如elclanrs所理解的那样(我们其他人最初没有理解),在模式中需要允许的唯一特殊字符是&-._

/^[\w&.\-]+$/
Run Code Online (Sandbox Code Playgroud)

[\ w]与[a-zA-Z0-9_]相同

虽然破折号在列表的开头或结尾时不需要转义,但我更喜欢在添加其他字符的情况下进行转义.此外,+表示您至少需要一个列出的字符.如果零是可以的(即空值),则用*替换它:

/^[\w&.\-]*$/
Run Code Online (Sandbox Code Playgroud)

  • 我建议任何允许所有这些特殊字符的列表也应该允许空格。 (3认同)

Ja͢*_*͢ck 16

那么,为什么不将它们添加到现有的角色类?

var pattern = /[a-zA-Z0-9&._-]/
Run Code Online (Sandbox Code Playgroud)

如果您需要检查字符串是否只包含那些字符,您还必须锚定表达式:

var pattern = /^[a-zA-Z0-9&._-]+$/
Run Code Online (Sandbox Code Playgroud)

分别添加^$匹配字符串的开头和结尾.

可以使用字母,数字或下划线进行测试\w,缩短表达范围:

var pattern = /^[\w&.-]+$/
Run Code Online (Sandbox Code Playgroud)

正如Nathan的评论中所提到的,如果你没有使用结果.match()(它返回一个已匹配的数组),最好使用RegExp.test()返回一个简单的布尔值:

if (pattern.test(qry)) {
    // qry is non-empty and only contains letters, numbers or special characters.
}
Run Code Online (Sandbox Code Playgroud)

更新2

如果我误读了这个问题,下面将检查是否满足所有三个不同的条件.

if (/[a-zA-Z]/.test(qry) && /[0-9]/.test(qry) && /[&._-]/.test(qry)) {
   // qry contains at least one letter, one number and one special character
}
Run Code Online (Sandbox Code Playgroud)

  • +1.值得一提的是使用`test`而不是`match`,因为你真的不需要找到匹配.这可以帮助提高性能,可读性,并可能帮助提问者学习新知识. (4认同)

elc*_*nrs 10

试试这个正则表达式:

/^[\w&.-]+$/
Run Code Online (Sandbox Code Playgroud)

你也可以使用test.

if ( pattern.test( qry ) ) {
  // valid
}
Run Code Online (Sandbox Code Playgroud)