java正则表达式能不能不按顺序匹配?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java正则表达式能不能不按顺序匹配?相关的知识,希望对你有一定的参考价值。

比如说检测密码的安全性,要求密码包含大写字母,小写字母与数字,但顺序不定,这个正则表达式怎么写呢

参考技术A 什么叫做顺序不定?你具体要满足什么样的顺序规则?追问

只要str内有大写字母和数字,str.match(regex)就返回true,不在乎大写字母和数字谁前谁后或者穿插在一起,用正则表达式可以吗

追答

(?=.*[A-Z])(?=.*[a-z])(?=.*\\d).*
必须同时包含大写字母、小写字母以及数字

以任何顺序匹配正则表达式

【中文标题】以任何顺序匹配正则表达式【英文标题】:Match regex in any order 【发布时间】:2013-09-27 12:04:04 【问题描述】:

我想用正则表达式检查复杂的密码。

它应该有 1 个数字 1 大写和一个小写字母,不按特定顺序。 所以我想到了这样的事情:

m = re.search(r"([a-z])([A-Z])(\d)", "1Az")
print(m.group())

但我不知道如何告诉他按任何顺序搜索。 我试着在网上看,但我没有找到有趣的东西,谢谢你的帮助。

【问题讨论】:

【参考方案1】:

为什么不只是:

if (re.search(r"[a-z]", input) and re.search(r"[A-Z]", input) and re.search(r"[0-9]", input)):
    # pass
else
    # don't pass

【讨论】:

哇......这个逻辑是怎么回事?不需要== None... 只需and 他们... +1 是的,这是通常首选的选择;分别测试每个。虽然可能需要对其进行更多优化。 @JonClements 抱歉,我不使用 Python,如果您可以编辑答案,我将不胜感激。 嗯,这是一个简单的方法。但是如果我有 10 种不同的表达方式呢?我想找到简短的解决方案。 :-) all(re.search(pattern, text) for pattern in ('[A-Z]', '[a-z]', r'\d')) 会让这更简单...【参考方案2】:

您可以尝试寻找密码验证正则表达式,该网站有很多;)

也就是说,您可以使用positive lookaheads 来做到这一点:

re.search(r"(?=.*[a-z])(?=.*[A-Z])(?=.*\d)", "1Az")

要真正匹配字符串...

re.search(r"(?=.*[a-z])(?=.*[A-Z])(?=.*\d).3", "1Az")

现在,确保密码长度为 3 个字符:

re.search(r"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).3$", "1Az")

积极的前瞻(?= ... ) 确保内部的表达式存在于要测试的字符串中。因此,字符串必须有一个小写字符 ((?=.*[a-z]))、一个大写字符 ((?=.*[A-Z])) 和一个数字 ((?=.*\d)) 才能使正则表达式“通过”。

【讨论】:

我对正则表达式概念真的很陌生,什么“?=。”意思是?那我比他面前有什么东西? @OrHalimi 我在回答中提供了链接和解释。不是?=.,而是(?= ).*。第一个是前瞻,第二个表示任何字符(换行符除外)任意次数。这允许在字符串中的任何地方“搜索”以确保前面有模式。因此,如果您有(?=.*a),它将确保您正在测试的字符串中的任何位置都有一个a 好的,谢谢,正则表达式是很难理解的事情之一。我会看看你给我的链接。非常感谢 @OrHalimi 是的,一开始可能很难理解,不幸的是^^ 请注意:(?=.*[a-z]) 可以更有效地写为:(?=[^a-z]*[a-z])。同样的技术也可以应用于其他前瞻。

以上是关于java正则表达式能不能不按顺序匹配?的主要内容,如果未能解决你的问题,请参考以下文章

以任何顺序匹配正则表达式

正则表达式以任何顺序匹配字符串标记?

正则匹配文件后缀的问题

巧解正则表达式环视

巧解正则表达式环视

求一个能匹配http://或者http开头的字符串的java正则表达式,就是匹配一些网址的,只要能匹配http就行。