多个字符类型的单个正则表达式

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"

以上是关于多个字符类型的单个正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Python爬虫编程思想(30):用正则表达式匹配多个字符串和任意单个字符

正则表达式

正则表达式或用单个空格替换多个空格的方法

正则表达式

正则表达式匹配一个或多个字母或数字包围的所有单个下划线

Python正则表达式详解