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


93

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

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

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

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

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

}

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


9
有趣的是,您的问题的答案在于标题,除了转义特殊字符和用正斜杠引起的例外。
sciritai 2011年

1
为什么不使用.addClass("check").removeClass("check")?而且看到if (someBoolean == true)代码总是让我感到畏缩。做吧if (someBoolean)。或者,更好的是,只是做$(".form table tr").eq(i+1).toggleClass("check", !!this); valid = valid && !!this;
gilly3 2011年

+1 @ gill3 thx进行代码审查-确实提供了很好的反馈。我过去曾经使用过这些简便方法。
pixelbobby 2011年

@ gilly3,它似乎在FF中非常有效,但!IE8。喜欢这个速记。我试图弄清楚IE8所做的不同。
pixelbobby 2011年

Answers:


171

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

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

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

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

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

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

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


为什么没有提到量词\ Q和\ E来转义字符序列?
SerG 2014年

找到这个解决方案之前,我快要落山的字符类除外路线:比赛的一切,但字母,数字,空格等
皮特阿尔文

1
连字符必须先出现是常识吗?我已经阅读了几十个SO答案和regex备忘单,这是我第一次听说。您的回答使我省下了很多麻烦。谢谢!
CF_HoneyBadger '16

2
@SerG \Q\E请不要在JS RegExp引擎中使用它:(/^\Q.\E$/.test('Q+E'); // true
Paul S.

1
@ q4w56反斜杠不在原始问题中指定的字符集中,因此不匹配的反斜杠是正确的。:)
Jeff Hillman

5

完成此操作的最简单,最短的方法:

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

说明

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

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

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

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

  • @# => @#字符

别忘了通过 u(unicode)标志。


您不需要^表示不需要吗?
韦伯

1
@Webber号。它们在大写字母中,因此该语句为负面。^当我们使用\w\s以小写字母表示时是必需的。
AmirZpr

3
这不是将其解释为在外部w还是外部s,并且由于这两个对象实际上并不相交,因此它只能让所有字符通过吗?(因此不过滤任何内容。)
Zael

2
@Zael是的,正则表达式(/[\W\S]/)可以让所有内容通过。我相信阿米尔将会得到的更准确的表示是[^\w\s]。在前者中,正则表达式说的是“匹配任何不是字母数字的字符不是空格的字符”,正如您所提到的,因为字母数字字符不是空格,所以一切都通过了,反之亦然。后者说:“匹配任何不是字母数字是不是空白”。当然,例外情况是重音符号(如À)由匹配[^\w\s]
杰西

这不包括_ char
MikeSchem

4

回答

/[\W\S_]/

说明

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

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


MikeSchem,您刚刚带我穿越了一个时光机。
pixelbobby

是的,我注意到了。很老,但是我觉得最简单的答案没有发布。
MikeSchem

这与下划线失败的以下答案有何不同?
sf8193

是的,您是对的,我会对此进行修改
MikeSchem

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

RegExp当您只可以使用正则表达式文字时,请不要使用构造函数。转义工作要少得多(无论如何大部分都是不必要的),而且效率更高。
Bergi

当您可以直接匹配角色时,为什么要使用复杂的前瞻功能?
Bergi

你能举个例子@Bergi吗?我不明白您的建议。
Arni Gudjonsson

-1

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

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

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


不,下划线缺失,并且所有不在ascii范围内的字符以及在ascii范围内的大多数控制字符都将与该类匹配。/[^\w\s]/.test('é') # true/[^\w\s]/.test('_') # false
卡西米尔(Casimir)和希波吕特(Hippolyte),

-7

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

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

22
您在回答什么问题?
Toto
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.