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

IT技术 javascript jquery regex
2021-03-11 23:19:51

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

}

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

6个回答

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

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

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

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

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

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

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

为什么没有提到用于转义字符序列的量词 \Q 和 \E?
2021-05-05 23:19:51
@SerG\Q并且\E不在 JS RegExp引擎中工作:(/^\Q.\E$/.test('Q+E'); // true
2021-05-07 23:19:51
在找到这个解决方案之前,我沿着字符类排除路线走下去:匹配除字母、数字、空格等之外的所有内容。
2021-05-09 23:19:51
连字符必须在前是常识吗?我已经阅读了数十个 SO 答案和正则表达式备忘单,这是我第一次听说。你的回答让我省了很多戏。谢谢!
2021-05-12 23:19:51
@q4w56 反斜杠不在原始问题中指定的字符集中,因此不匹配反斜杠是正确的。:)
2021-05-16 23:19:51

实现此目的的最简单和最短的方法:

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

解释

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

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

  • \d => 匹配数字零到九

  • \s => 匹配任何类型的不可见字符

  • @# =>@#字符

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

你不需要 ^ 来表示不是吗?
2021-04-23 23:19:51
这不是将其解释为外部w或外部s,并且由于这两个实际上并不相交,因此它只会让所有字符通过?(因此不过滤任何东西。)
2021-04-26 23:19:51
@Webber 不。他们在资本中,这使得声明是否定的。^当我们使用\w\s小写字母时需要。
2021-05-03 23:19:51
@Zael你是对的,所述的正则表达式 ( /[\W\S]/) 确实让一切都通过了。我认为 Amir 的意思的更准确表示是[^\w\s]. 在前者中,正则表达式是说“匹配任何不是字母数字不是空格的东西”,正如您所提到的,因为字母数字字符不是空格,反之亦然。后者说“匹配任何不是字母数字不是空格的东西”。当然,例外情况适用于重音字符(如À)与[^\w\s].
2021-05-08 23:19:51
这不包括 _ 字符
2021-05-12 23:19:51

回答

/[\W\S_]/

解释

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

\W将选择所有非“单词”字符等效于[^a-zA-Z0-9_]
\S将选择所有非“空白”字符等效于[ \t\n\r\f\v]
_将选择“_”因为我们在使用时否定它\W并且需要将其添加回

是的,我注意到了。是旧的,但我觉得最简单的答案没有发布。
2021-04-19 23:19:51
这与下面的下划线失败的答案有什么不同?
2021-04-26 23:19:51
@MikeSchem 你提前旅行了。非常简单和甜蜜
2021-05-03 23:19:51
MikeSchem,你带我穿越了时光机。
2021-05-15 23:19:51
// 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);
  };
RegExp当您只能使用正则表达式文字时,请不要使用构造函数。逃避的工作要少得多(无论如何,其中大部分都是不必要的),而且效率也更高。
2021-04-21 23:19:51
当您可以直接匹配字符时,为什么要使用复杂的前瞻?
2021-05-06 23:19:51
你能举个例子@Bergi吗?我不明白你在暗示什么。
2021-05-13 23:19:51

实现这一目标的一个简单方法是负集 [^\w\s]。这基本上抓住了:

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

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

不,下划线丢失,所有超出 ascii 范围的字符以及 ascii 范围内的大多数控制字符都与此类匹配。/[^\w\s]/.test('é') # true, /[^\w\s]/.test('_') # false.
2021-04-28 23:19:51