正则表达式密码验证

时间:2011-02-16 23:47:29

标签: java regex

我如何得到它,以便检查字符串中的2位或更多位数?在String s上调用匹配。

s.matches("^[a-zA-Z0-9]{8,}$");

6 个答案:

答案 0 :(得分:8)

应该这样做......

^(?=.*[0-9].*[0-9])[a-zA-Z0-9]{8,}$

我做的唯一更改是添加此(?=.*[0-9].*[0-9]),这是一个积极的前瞻,将尝试找到密码中的前两位数字。如果它满足,则正则表达式将照常进行。

现在,我只是想我会指出你的正则表达式将禁止特殊字符(标点符号等)。实际上,有些人喜欢在密码中输入这样的奇怪字符。

所以你可能会考虑更像这样的事情......

^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).{8,}$

这将允许特殊字符,同时还确保密码中至少存在一个大写字母,一个小写字母和一个数字。这只是我写了一段时间的强密码正则表达式的一个例子,如果你愿意的话,你当然可以放松一下这些限制。

答案 1 :(得分:1)

匹配两次:

s.matches("^[a-zA-Z0-9]{8,}$");
s.matches("[0-9].*[0-9]");

使用如下结果:

if ( s.matches("^[a-zA-Z0-9]{8,}$") && s.matches("[0-9].*[0-9]") ) {
    # password is valid
}

答案 2 :(得分:1)

我真的没有理由用正则表达式来检查字符串的长度 - 保持简单总是一个好主意,但特别是正则表达式将一切都扔进一个完全不可读的字符串的诱惑(可能有一些奇怪的边缘箱子很诱人。

只需使用长度方法,例如“\ w *?\ d \ w *?\ d \ w *” 请注意。*是贪婪所以不要忘了?在它之后。 \ d表示java中的一个数字 - 我不认为有任何你会错过[0-9]的unicode的情况 - 但是比抱歉更安全

编辑使用\ w而不是。 (只有字符,即[a-zA-Z_0-9])

答案 3 :(得分:1)

试试这个: (?:^|\s+)(\w{8,})(?<=(.*\d.*\d.*))(?:\s+|$)

修改为允许超过8个字符来自: http://social.msdn.microsoft.com/Forums/en/regexp/thread/8e0ced1f-8ddc-4583-89de-e29b4c4dc726

答案 4 :(得分:1)

修改

请勿使用match,而是使用find。 (阅读the documentation

  

匹配方法尝试将整个输入序列与模式匹配。&gt;

这就是\d.*\d无法与a2a2a

一起使用的原因
  

find方法扫描输入序列,寻找与模式匹配的下一个子序列。

这就是你需要的。

您只需要测试\d.*\d之间是否有两个数字:

import java.util.regex.*;
class TwoDigits { 
    public static void main( String ... args ) { 
        Pattern pattern = Pattern.compile("\\d.*\\d");
        Matcher matcher = pattern.matcher( args[0]  );  
        System.out.println("Matched ( found ) ? = " + matcher.find());
    }
}

但也许我在这里遗漏了一些东西,为什么不尝试它并告诉我们失败的地方。

C:\java>java TwoDigits ""
Matched ( found ) ? = false

C:\java>java TwoDigits "a"
Matched ( found ) ? = false

C:\java>java TwoDigits "1a1"
Matched ( found ) ? = true

C:\java>java TwoDigits "1a"
Matched ( found ) ? = false

C:\java>java TwoDigits "a1a"
Matched ( found ) ? = false

C:\java>java TwoDigits "a1a1"
Matched ( found ) ? = true

C:\java>java TwoDigits "2a2"
Matched ( found ) ? = true

C:\java>java TwoDigits "2aaa2"
Matched ( found ) ? = true

C:\java>java TwoDigits "2aaaaaaaaaaaaaaa2"
Matched ( found ) ? = true

C:\java>java TwoDigits "2aaaaaaaaaaaaaaa"
Matched ( found ) ? = false

C:\java>java TwoDigits "2aaaaaa2aaaaaaaaaa"
Matched ( found ) ? = true

C:\java>java TwoDigits "a3aaaaa2aaaaaaaaaa"
Matched ( found ) ? = true

答案 5 :(得分:1)

这个怎么样?

private Pattern p1  = Pattern.compile("^\\w{8,}$");
private Pattern p2  = Pattern.compile("\\d+(.*)?\\d+");

private boolean match(String s) {
    return p1.matcher(s).find() && p2.matcher(s).find();
}

@Test
public void testPassword() {
    assertTrue("length at least 8", match("2aaaaaa2"));
    assertTrue("length at least 8", match("aaaaaaa22"));
    assertTrue("length at least 8", match("22aaaaaaa"));
    assertTrue("length at least 8", match("aa2aa2aaa"));

    assertFalse("length less than 8", match("2aa2aaa"));
    assertFalse("one digit", match("aa2aaaaa"));
    assertFalse("no digits", match("aaaaaaaa"));
}