正则表达式匹配符号:! $ % ^和 ;*()_+|~-=`{}[]:& ”;& # 39;& lt; ?,./

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

本文关键字:lt 符号 正则表达式      更新时间:2023-09-26

我试图在JavaScript中创建一个Regex测试,该测试将测试字符串是否包含任何这些字符:

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

更多信息,如果你感兴趣:)

这是一个很酷的密码更改应用程序,我正在工作。如果您感兴趣,这里是剩余的代码。

我有一个列出密码要求的表,当最终用户键入新密码时,它将测试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);
}

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

这个正则表达式非常简单。只需使用字符类。连字符是字符类中的一个特殊字符,所以它需要放在前面:

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

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

编辑:

连字符是特殊的,因为它可以用来表示一个字符范围。同样的字符类可以简化为这样的范围:

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

有三个范围。'$' to '/', ':' to '?,从"{"到"~"。最后一个字符串不能更简单地表示为一个范围:!"^_ '[]。

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

答案

/['W'S_]/
<标题>

这将创建一个字符类,删除单词字符、空格字符,并添加下划线字符(因为下划线是"word")字符)。剩下的就是特殊字符了。大写字母表示对应的小写字母的否定。

'W将选择所有非"word"相当于[^a-zA-Z0-9_]的字符
'S将选择所有非"空格";相当于[ 't'n'r'f'v]的字符
_将选择"因为我们在使用'W时否定了它,需要将它添加回

做到这一点的最简单和最短的方法:

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

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

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

  • 'd =>匹配从0到9的数字

  • 's =>匹配任何不可见字符

  • @# =>@#字符

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

实现这一点的一个简单方法是负集[^'w's]。这实际上捕获了:

  • 非字母数字字符(字母和数字)
  • 任何非空格、制表符或换行符(统称为空白)的内容

由于某些原因['W'S]不以同样的方式工作,它不做任何过滤。Zael对其中一个答案的评论提供了一些解释。

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

以@jeff-hillman的回答为基础,这是完整的版本

/[''@#$-/:-?{-~!"^_`'[']]/

测试
function noSpecialChars(str) {
  const match = str.match(/[''@#$-/:-?{-~!"^_`'[']]/)
  if (!match) return
  
  throw new Error("got unsupported characters: " + match[0])
}
// prettier-ignore
const symbols = ["!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-", "_", "+", "=", ".", ":", ";", "|","~","`","{","}","[","]","'"","'","<",">","?","/", "''"]
symbols.forEach((s) => {
  it(`validates no symbol ${s}`, async () => {
    expect(() => {
      noSpecialChars(s)
    }).toThrow();
  })
})

(?='W_)(?='S).呢?它检查.匹配的字符不是一个单词字符(但_是允许的),并且它不是空格。

注意:正如@Casimir et Hippolyte在另一条评论中指出的那样,这也将匹配诸如"之类的字符。如果您不期望这样的字符,那么这是一个工作的解决方案。