【问题标题】:Matching special characters and letters in regex匹配正则表达式中的特殊字符和字母
【发布时间】:2012-12-06 11:12:08
【问题描述】:

我正在尝试验证一个字符串,它应该只包含字母数字和特殊字符&-._。为此,我尝试使用正则表达式。

var pattern = /[a-zA-Z0-9&_\.-]/
var qry = 'abc&*';
if(qry.match(pattern)) {
    alert('valid');
}
else{
    alert('invalid');
}

使用上述代码时,字符串abc&* 是有效的。但我的要求是证明这个无效。即,当出现除字母、数字或特殊字符&-._ 之外的字符时,该字符串应评估为无效。我怎么能用正则表达式做到这一点?

【问题讨论】:

  • 关键是在开头使用^,在结尾使用+$,正如下面的答案所解释的那样。 /^[a-zA-Z0-9&_\.-]+$/。我指出这一点,以防你错过了细微的差别。

标签: javascript regex special-characters


【解决方案1】:

我尝试了其中的一堆,但没有一个对我的所有测试都有效。所以我发现了这个:

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9])(?!.*\s).{8,15}$

来自此来源:https://www.w3resource.com/javascript/form/password-validation.php

【讨论】:

    【解决方案2】:
    let pattern = /^(?=.*[0-9])(?=.*[!@#$%^&*])(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9!@#$%^&*]{6,16}$/;
    
    //following will give you the result as true(if the password contains Capital, small letter, number and special character) or false based on the string format
    
    let reee =pattern .test("helLo123@");   //true as it contains all the above
    

    【讨论】:

    • 能否请您a)将您的代码格式化为代码并b)添加一些解释?
    【解决方案3】:

    试试这个正则表达式:匹配我们在段落和字母中使用的特殊字符

       Javascript : /^[a-zA-Z]+(([\'\,\.\-_ \/)(:][a-zA-Z_ ])?[a-zA-Z_ .]*)*$/.test(str)
    
                    .test(str) returns boolean value if matched true and not matched false
    
                c# :  ^[a-zA-Z]+(([\'\,\.\-_ \/)(:][a-zA-Z_ ])?[a-zA-Z_ .]*)*$
    

    【讨论】:

      【解决方案4】:

      那么,为什么不将它们添加到您现有的角色类中呢?

      var pattern = /[a-zA-Z0-9&._-]/
      

      如果您需要检查字符串是否只包含那些字符,您还必须锚定表达式:

      var pattern = /^[a-zA-Z0-9&._-]+$/
      

      添加的^$分别匹​​配字符串的开头和结尾。

      可以使用\w 来测试字母、数字或下划线,这会缩短您的表达:

      var pattern = /^[\w&.-]+$/
      

      正如 Nathan 的评论中提到的,如果您没有使用来自 .match() 的结果(它返回一个包含匹配内容的数组),最好使用返回一个简单布尔值的 RegExp.test()

      if (pattern.test(qry)) {
          // qry is non-empty and only contains letters, numbers or special characters.
      }
      

      更新 2

      如果我误读了问题,下面将检查是否满足所有三个单独的条件。

      if (/[a-zA-Z]/.test(qry) && /[0-9]/.test(qry) && /[&._-]/.test(qry)) {
         // qry contains at least one letter, one number and one special character
      }
      

      【讨论】:

      • +1。可能值得一提的是使用test 而不是match,因为您实际上并不需要找到匹配项。这有助于提高性能和可读性,并可能帮助提问者学习新知识。
      • 另外,i 后面没有斜线。 /[a-z]/i/ 应该是 /[a-z]/i
      【解决方案5】:

      试试这个正则表达式:

      /^[\w&.-]+$/
      

      您也可以使用test

      if ( pattern.test( qry ) ) {
        // valid
      }
      

      【讨论】:

        【解决方案6】:

        将它们添加到允许的字符中,但您需要转义其中一些,例如 -]/\

        var pattern = /^[a-zA-Z0-9!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]*$/
        

        这样你就可以删除你想要禁止的任何单个字符。

        另外,您希望包含字符串地标 ^ 和 $ 的开始和结束

        更新:

        正如 elclanrs 所理解的(而我们其他人最初并不理解),模式中需要允许的唯一特殊字符是 &-._

        /^[\w&.\-]+$/
        

        [\w] 与 [a-zA-Z0-9_] 相同

        虽然破折号在列表的开头或结尾不需要转义,但我更喜欢这样做,以防添加其他字符。此外,+ 表示您至少需要列出的字符之一。如果零也可以(即空值),则将其替换为 *:

        /^[\w&.\-]*$/
        

        【讨论】:

        • 我建议任何允许所有这些特殊字符的列表也应该允许空格。
        • 加号 (+) 字符不适用于此表达式
        • @callbertts,你的意思是它包含在“var pattern...”中的字符列表中吗?您使用哪种语言? Javascript?
        • @HighlyIrregular 我试过用Javascript匹配一个带加号(+)的字符串,但我发现这并不容易,实际上,我只是放弃了这个并进行了单独的验证.
        • @callbertts,当 + 字符不在方括号中时,需要对其进行转义或将其视为通配符。作为通配符,它​​意味着:匹配 1 个或多个先前的字符/字符组(取决于它们是用圆括号还是方括号括起来等)。例如,在模式 /^[\w&.\-]+$/ 中,+ 字符被用作通配符。
        猜你喜欢
        • 2022-08-17
        • 1970-01-01
        • 1970-01-01
        • 2021-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多