匹配符号的正则表达式:!$%^& *()_ + |〜 - =`{} []:“;'<>?,。/。

时间:2011-12-02 16:38:42

标签: javascript jquery regex

我正在尝试在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);

}

是的,还有相应的服务器端验证!

7 个答案:

答案 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");