【问题标题】:Regex to match multiple patterns in any order正则表达式以任何顺序匹配多个模式
【发布时间】:2011-01-25 08:28:25
【问题描述】:

我正在验证 ASP.NET MVC3 应用程序中的复杂性密码。我目前的要求是它必须至少包含一个大写字母,一个小写字母,一个数字,并且不超过三个重复字符。不过,我想概括这些数字,并为非字母数字字符添加条件。

目前,我仅在服务器端进行验证,因此我可以针对每个条件使用一个正则表达式多次调用 Regex.IsMatch。我也希望能够验证客户端。因为不显眼的 jQuery 验证只允许一个正则表达式,我需要将所有五个条件组合成一个模式。

我对正则表达式了解不多,但我最近一直在阅读。我可能遗漏了一些简单的东西,但我找不到一种方法来将多个模式组合在一起。将 OR 他们。

【问题讨论】:

    标签: javascript .net regex


    【解决方案1】:

    您可以在单个正则表达式中使用多个 lookahead assertions 来执行此操作(在 .NET 中):

    ^(?=.*\p{Lu})(?:.*\p{Ll})(?=.*\d)(?=.*\W)(?!.*(.).*\1.*\1)
    

    如果所有条件都为真,则匹配。

    ^                  # Match the start of the string
    (?=.*\p{Lu})       # True if there is at least one uppercase letter ahead
    (?=.*\p{Ll})       # True if there is at least one lowercase letter ahead
    (?=.*\d)           # True if there is at least one digit ahead
    (?=.*\W)           # True if there is at least one non-alnum character ahead
    (?!.*(.).*\1.*\1)  # True if there is no character repeated twice ahead
    

    请注意,匹配不会消耗字符串的任何字符 - 如果您希望匹配操作返回您要匹配的字符串,请在正则表达式的末尾添加 .*

    在 JavaScript 中,您不能使用 Unicode 字符属性。所以你可以使用

    ^(?=.*[A-Z])(?:.*[a-z])(?=.*\d)(?=.*\W)(?!.*(.).*\1.*\1)
    

    当然只会使用 ASCII 字母进行验证。如果这对你来说没问题,那很好。你可以去增加像[A-ZÄÖÜÀÈÌÒÙÁÉÍÓÚ] 这样的字符类等等,但你可能永远不会完成这个。在服务器端,如果您希望验证产生相同的结果,则必须指定 RegexOptions.ECMAScript,以便 .NET 正则表达式引擎的行为类似于 JavaScript 引擎(感谢 Alan Moore 的注意!)。

    【讨论】:

    • 我很难让这种模式在 Rubular 上工作:rubular.com/r/008s20R3fa
    • @dorkitude:1.9 之前的 Ruby 正则表达式不支持像 \p{Lu}\p{Ll} 这样的 Unicode 属性。在像这样的 .NET 驱动的测试器中尝试:derekslager.com/blog/posts/2007/09/…
    • 是的,Ruby 不支持 Unicode 字符属性(\p{Lu} 等),我认为至少 Ruby 1.8 是 Rubular 使用的。如果您改用[A-Z](而[a-z] 用于\p{Ll})它应该可以工作,但是您会丢失所有非ASCII 字母。
    • 事实上,@Tim,JavaScript 也不支持 Unicode 属性。由于这个问题的重点是创建一个可以在客户端工作的正则表达式,我认为无论如何你都必须切换到[A-Z][a-z]。而当你在服务器上运行它时,你应该指定ECMAScript模式,使\d\W在客户端工作时一样。
    • @Alan Moore:哦,我忽略了这一点——我看到了 .NET 标签并认为“太好了,可以使用 Unicode!”。将编辑。
    猜你喜欢
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 2014-12-06
    • 1970-01-01
    相关资源
    最近更新 更多