【问题标题】:Regex to Match Symbols: !$%^&*()_+|~-=`{}[]:";'<>?,./匹配符号的正则表达式:!$%^&*()_+|~-=`{}[]:";'<>?,./
【发布时间】:2012-01-11 16:09:54
【问题描述】:

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

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

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

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

我有一个列出密码要求的表格,当最终用户键入新密码时,它将测试一个正则表达式数组并在相应的表格行中放置一个复选标记,如果它...签出 :) 我只需要添加这个来代替 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);

}

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

【问题讨论】:

  • 很有趣,你的问题的答案在于标题,除了转义特殊字符和包含正斜杠。
  • 为什么不使用.addClass("check").removeClass("check")?在代码中看到if (someBoolean == true) 总是让我畏缩。只需执行if (someBoolean)。或者,更好的是,只需 $(".form table tr").eq(i+1).toggleClass("check", !!this); valid = valid &amp;&amp; !!this;
  • +1 @gill3 感谢代码审查 - 确实有很好的反馈。我过去使用过这些速记方法。
  • @gilly3,它似乎在 FF 中运行良好,但在 IE8 中。喜欢这个速记。我试图弄清楚 IE8 的不同之处。

标签: javascript jquery regex


【解决方案1】:

(?=\W_)(?=\S). 怎么样?它检查与. 匹配的字符不是单词字符(但是_ 是允许的)并且它不是空格。

注意:正如@Casimir et Hippolyte 在另一条评论中指出的那样,这也将匹配 é 等字符。如果您不希望出现这样的字符,那么这是一个可行的解决方案。

【讨论】:

    【解决方案2】:

    完成此任务的最简单和最短的方法:

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

    说明

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

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

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

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

    • @# => @# 字符

    别忘了传递u(unicode)标志。

    【讨论】:

    • 不需要 ^ 来表示不需要吗?
    • @Webber 不,他们是大写字母,这使得声明是否定的。当我们使用小写字母\w\s时需要^
    • 这不是将它解释为在w 之外或s 之外,并且由于这两者并没有真正相交,它只是让所有字符通过? (因此不过滤任何东西。)
    • @Zael 你说得对,正则表达式 (/[\W\S]/) 确实让一切都通过了。 [^\w\s] 是我认为 Amir 得到的更准确的表示。在前者中,正则表达式是说“匹配任何不是字母数字 OR 也不是空格的东西”,正如你所提到的,让我们完成所有事情,因为字母数字字符不是空格,反之亦然。后者表示“匹配任何不是字母数字 AND 且不是空格的内容”。当然,例外情况适用于重音字符(如À)与[^\w\s] 匹配。
    • 这不包括_字符
    【解决方案3】:

    回答

    /[\W\S_]/
    

    说明

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

    \W 将选择所有等同于[^a-zA-Z0-9_] 的非“单词”字符
    \S 将选择所有等同于[ \t\n\r\f\v] 的非“空白”字符
    _ 将选择“_”,因为我们在使用\W时将其取反,需要重新添加

    【讨论】:

    • MikeSchem,你刚刚带我穿越了时光机。
    • 是的,我注意到了。很旧,但我觉得没有发布最简单的答案。
    • 这与下面下划线失败的答案有何不同?
    • @MikeSchem 你提前旅行了。非常简单和甜蜜
    【解决方案4】:

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

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

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

    【讨论】:

    • 不,缺少下划线,所有超出 ascii 范围的字符和 ascii 范围内的大多数控制字符都将匹配此类。 /[^\w\s]/.test('é') # true, /[^\w\s]/.test('_') # false.
    【解决方案5】:
    // 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 构造函数。逃避工作要少得多(无论如何大部分都是不必要的),而且效率也更高。
    • 既然可以直接匹配字符,为什么还要使用复杂的前瞻?
    • 你能举个例子@Bergi吗?我不明白你的建议。
    【解决方案6】:

    将“A”中任何语言的所有后者替换为 0,例如,如果您希望将所有数字替换为 0:

    return str.replace(/[^\s!-@[-`{-~]/g, "A").replace(/\d/g, "0");
    

    【讨论】:

    • 你在回答什么问题?
    【解决方案7】:

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

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

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

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

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

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

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

    【讨论】:

    • 为什么没有提到量词 \Q 和 \E 来转义字符序列?
    • 在找到这个解决方案之前,我一直在走字符类排除路线:匹配除 alpha、数字、空格等之外的所有内容。
    • 连字符必须在前是常识吗?我已经阅读了几十个 SO 答案和正则表达式备忘单,这是我第一次听说它。你的回答为我节省了很多戏剧性。谢谢!
    • @SerG \Q\E 在 JS RegExp 引擎中不起作用:( /^\Q.\E$/.test('Q+E'); // true
    • @q4w56 反斜杠不在原始问题中指定的字符集中,因此不匹配的反斜杠是正确的。 :)
    猜你喜欢
    • 2017-07-02
    • 2013-01-09
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    相关资源
    最近更新 更多