Negating a complex regex containing three parts
我需要一个正则表达式,当字符串没有小写和大写字母时匹配。
- 如果字符串只有小写字母 -> 应该匹配
- 如果字符串只有大写字母 -> 应该匹配
- 如果字符串只有数字或特殊字符 -> 应该匹配
例如
基本上我需要以下正则表达式的逆/否定:
^(?=.*[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]+?)$ |
它转换为"如果整个字符串由非小写字母或非大写字母组成,则匹配字符串。"
使用惰性量词
如果您有特定允许的特殊字符的白名单,则将
https://regex101.com/r/Wg6tLn/1
你可以使用这个正则表达式
1 | ^(([A-Z0-9?&%^](?![a-z]))+|([a-z0-9?&%^](?![A-Z]))+)$ |
您可以在这里测试更多案例。
我只添加了字符