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

2022-08-30 05:17:48

我正在尝试在JavaScript中创建一个正则表达式测试,该测试将测试一个字符串以包含以下任何字符:

!$%^&*()_+|~-=`{}[]:";'<>?,./

更多信息 如果您有兴趣,:)

这是一个非常酷的密码更改应用程序,我正在研究。如果您有兴趣,这里是代码的其余部分。

我有一个列出密码要求的表,当最终用户键入新密码时,它将测试正则表达式数组,并在相应的表行中放置一个复选标记,如果它...退房:)我只需要添加这个来代替数组中的第4项。validation

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);

}

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


答案 1

这个的正则表达式非常简单。只需使用字符类。连字符是字符类中的特殊字符,因此它必须位于第一位:

/[-!$%^&*()_+|~=`{}\[\]:";'<>?,.\/]/

您还需要转义其他正则表达式元字符。

编辑:连字符是特殊的,因为它可用于表示一系列字符。这个相同的字符类可以用以下范围来简化:

/[$-/:-?{-~!"^_`\[\]]/

有三个范围。“$”到“/”,“:”到“?”,“{”到“~”。最后一串字符不能用范围更简单地表示:!”^_`[].

使用 ACSII 表查找字符类的范围。


答案 2

实现此目的的最简单,最快捷的方法:

/[^\p{L}\d\s@#]/u

解释

[^...]匹配以下列表中不存在的单个字符

  • \p{L}=>匹配任何语言的任何类型的字母

  • \d=>匹配数字 0 到 9

  • \s=>匹配任何类型的隐形字符

  • @# => @和字符#

不要忘记传递(unicode)标志。u