首页 > 解决方案 > 至少一个特定字符的正则表达式

问题描述

我有一个模式如下

pattern='(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[-+*/%])(?=.*[.?,:;-~]).*';

我想要的至少是:一个大写值一个小写值一个数字值最后两个括号中的每个字符之一。

但是,我的正则表达式不能正常工作(即使我至少有一个,它也会显示一个错误)

这种模式的正确形式是什么?

标签: regex

解决方案


您可以使用对比原理,即:

^                        # start of the string
(?=[^A-Z]*[A-Z])         # not A-Z, zero or more times, A-Z once
(?=[^a-z]*[a-z])         # ... same with lower case letters ...
(?=\D*\d)                # ... digits ...
(?=[^-+*/%]*[-+*/%])     # ... first "special character" ...
(?=[^-~.?,:;]*[-~.?,:;]) # ... second "special character" ...
.+                       # one character or more
$                        # end of the string

方法如下:

(?=[^characters I do not want]*[^characters I do want])
#  ^^^ - negation

请参阅regex101.com 上的演示(那里的换行符仅供在线测试人员使用)。


推荐阅读