【问题标题】:making special characters optional in regular expression在正则表达式中使特殊字符可选
【发布时间】:2012-01-18 21:44:56
【问题描述】:

我有以下要求:

密码必须是 6-18 个字符,并且至少包含一个字母和一个数字。允许使用特殊字符,例如 @、%、&、#。

我已经创建了这个:

^.*(?=.{6,18})(?=.*\d)(?=.*[A-Za-z])(?=.*[@%&#]).*$

但它也接受其他特殊字符,如 _ 并且它要求这些特殊字符之一 @% 必须在字符串中。我想让这个可选。表示如果用户输入这些特殊字符之一,则字符串应该是有效的,但如果用户没有输入这些字符,那么它不应该是无效的。如果用户输入任何其他特殊字符,字符串应该是无效的。

【问题讨论】:

  • 你为什么要标记这个nsregularexpression?这是关于 ASP.NET 还是 Objective-C 的问题?

标签: regex asp.net-mvc-3


【解决方案1】:

正如其他响应者所说,匹配那些不需要的字符的是 .*。第一个 .* 根本不应该存在,第二个应该替换为字符类。

或者更好的是,在第一个前瞻的末尾添加一个$;现在它验证了长度和组成。最后的 .* 和前瞻中的两个都可以,因为该组合已经过验证。

^(?=[A-Za-z0-9@%&#]{6,18}$)(?=.*\d)(?=.*[A-Za-z]).*$

or, more readably:

^                             # start of string
(?=[A-Za-z0-9@%&#]{6,18})$    # length and composition
(?=.*\d)                      # required digit
(?=.*[A-Za-z])                # required letter
.*                            # go ahead and consume it
$                             # end of string

【讨论】:

    【解决方案2】:

    '.'允许换行符 (\n) 旁边的任何字符,因此如果您省略正则表达式的最后一部分,它应该满足您的需要:

    ^.*(?=.{6,18})(?=.*\d)(?=.*[A-Za-z]).*$
    

    如果您希望某些字符不被允许使用,例如“_”,您可以将它们放在否定的前面,例如

    ^.*(?=.{6,18})(?=.*\d)(?=.*[A-Za-z])(?!.*[_]).*$
    

    不允许在字符串中出现 '_' 和 '*'。

    【讨论】:

    • 这个有效。最后一件事。我们可以以某种方式禁止除这 4 个以外的所有特殊字符吗?
    • 试试这个^[0-9a-zA-Z@#%&]*(?=.{6,18})(?=[0-9a-zA-Z@#%&]*\d)(?=[0-9a-zA-Z@#%&]*[A-Za-z])[0-9a-zA-Z@#%&]*$ 和@A.B.Cade 的想法一样。
    • @user1125955:为什么不允许密码中包含任何字符?
    【解决方案3】:

    而不是使用“。”这几乎允许一切,使用类似的东西:

    [0-9a-zA-Z@#%&]
    

    【讨论】:

      【解决方案4】:

      对于长度,只需使用字符串长度函数即可。

      然后简单地测试您的输入是否符合[0-9],[A-Za-z]and^[0-9A-Za-z@%]+$`。

      【讨论】:

      • 我也想允许@% 这些字符(虽然是可选的)
      • 好吧,这将允许他们——它只测试至少有一个字母和一个数字,就是这样。正则表达式没有锚定!
      • fge 我只想允许这些特殊字符,所有其他特殊字符/字符都应该被禁止。
      猜你喜欢
      • 1970-01-01
      • 2018-06-13
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-28
      相关资源
      最近更新 更多