多个字符类型的单个正则表达式
Posted
技术标签:
【中文标题】多个字符类型的单个正则表达式【英文标题】:Single regex for multiples of a character type 【发布时间】:2012-12-14 03:58:05 【问题描述】:我正在寻找一个 单个 java regex 来断言任何长度的字符串(实际上是密码)具有:
至少 2 个小写字母 至少 2 个大写字母 至少 2 个数字字符 至少 1 个字符,不是字母或数字用于匹配,例如:
password.matches("some regex");
这里的“重要”部分是必须有多个的字符类型。我发现的其他问题是关于“至少一个”,而不是“至少两个”的字符类型。
这可以通过多个matches()调用来完成,但是正则表达式将被外部化为一个字符串,所以它需要一个对matches()
的调用。
【问题讨论】:
我认为这与前瞻有关,我不熟悉如何正确 我认为这不能通过正则表达式来完成。但只需几行普通的旧 java 代码就可以轻松完成。 我认为使用 4 个单独的正则表达式可以轻松完成。 当复杂性规则发生变化时,正则表达式会发生什么变化? @msandiford 查看编辑 - 没问题 【参考方案1】:理论上,您可以使用以下模式:
(?=.*[A-Z].*[A-Z])(?=.*[a-z].*[a-z])(?=.*\\d.*\\d)(?=.*[^A-Za-z\\d]).*
但是,对于实际用途,我宁愿坚持正确的编程,而不是依赖像这样的正则表达式。
【讨论】:
+1 还可以使其与matches
一起使用,在正则表达式的末尾添加.*
,因为look-around 是零宽度。
@Pshemo:当然,你是对的。我完全忘记了这种行为。我现在已经编辑了我的帖子。 +1
会匹配密码“Aa1Aa1!”吗?
@user1883592:是的,它确实匹配。
@user1883592:您在使用String.matcher()
函数时会这样做。它检查是否完全匹配,这意味着(就说话而言)它将 ^ 添加到开头,如果未添加到字符串中,则将 $ 添加到末尾。例如,表达式foo
(阅读:^foo$
)将不匹配字符串"foobar"
。但是,foo.*
(阅读:^foo.*$
)将匹配 "foobar"
。以上是关于多个字符类型的单个正则表达式的主要内容,如果未能解决你的问题,请参考以下文章