否定包含三个部分的复杂正则表达式

Negating a complex regex containing three parts

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

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

例如

abcabc123abc123ABC123;^ - 应该匹配

abcA12bAB^%12c - 不应匹配

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

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


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

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

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

在 regex101 上查看这个演示(使用 + 表示一个或多个)


你可以使用

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

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

查看正则表达式演示 #1 和正则表达式演示 #2

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

详情

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

我会选择:

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

它转换为"如果整个字符串由非小写字母或非大写字母组成,则匹配字符串。"

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

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

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


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

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

您可以在这里测试更多案例。

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