【问题标题】:Negating a complex regex containing three parts否定包含三个部分的复杂正则表达式
【发布时间】:2020-04-13 02:02:37
【问题描述】:

我需要一个正则表达式,当字符串不包含小写和大写字母时匹配。

  • 如果字符串只有小写字母 -> 应该匹配
  • 如果字符串只有大写字母 -> 应该匹配
  • 如果字符串只有数字或特殊字符 -> 应该匹配

例如

abcABC123abc123ABC123&^ - 应该匹配

AbCA12bAB^%12c - 不应该匹配

基本上我需要以下正则表达式的逆/否定:

^(?=.*[a-z])(?=.*[A-Z]).+$

【问题讨论】:

    标签: regex regex-negation


    【解决方案1】:

    你可以使用

    ^(?!.*[A-Z].*[a-z])(?!.*[a-z].*[A-Z])\S+$
    

    或者

    ^(?=(?:[^a-z]+|[^A-Z]+)$).*$
    

    查看regex demo #1regex demo #2

    当您需要对模式应用更多限制时,可以在更复杂的场景中使用这样的环视解决方案。否则,请考虑non-lookaround solution

    详情

    • ^ - 字符串开头
    • (?!.*[A-Z].*[a-z]) - 没有大写字母后跟小写字母
    • (?!.*[a-z].*[A-Z]) - 没有小写字母后跟一个大写字母
    • (?=(?:[^a-z]+|[^A-Z]+)$) - 正向前瞻,要求字符串末尾有 1 个或多个字符,而不是小写 ASCII 字母 ([^a-z]+),或者字符串末尾需要 1 个或多个字符,而不是大写 ASCII 字母 ([^A-Z]+)字符串
    • .+ - 除换行符以外的 1+ 个字符
    • $ - 字符串结束。

    【讨论】:

      【解决方案2】:

      我会选择:

      ^(?:[^a-z]+?|[^A-Z]+?)$
      

      它翻译为“如果整个字符串由非小写字母或非大写字母组成,则匹配该字符串。”

      使用惰性量词 +? 以便在启用多行标志时遵循结束字符串 $ 锚点。如果您只验证单行字符串,您可以简单地使用 + 而不带问号。

      如果您有特定允许的特殊字符的白名单,请将[^A-Z] 更改为[A-Z0-9()_+=-] 并列出允许的特殊字符。

      https://regex101.com/r/Wg6tLn/1

      【讨论】:

        【解决方案3】:

        听起来好像不需要任何环视。

        要么只匹配 not a-z 的字符,要么只匹配不是 A-Z 的字符。

        ^(?:[^a-z]+|[^A-Z]+)$
        

        See this demo at regex101(使用+ for one or more

        【讨论】:

          【解决方案4】:

          你可以使用这个正则表达式

          ^(([A-Z0-9?&%^](?![a-z]))+|([a-z0-9?&%^](?![A-Z]))+)$
          

          您可以测试更多案例here

          我只添加了字符 ?&%^ 作为可能的字符,但您可以添加任何您喜欢的字符。

          【讨论】:

            猜你喜欢
            • 2021-12-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-19
            • 2015-02-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多