验证密码是否合法

JAVA 2015-12-10

起步

有这样一个需要保证密码有数字,有字母(可小写可大写),不能包含标点,长度在6~20个字符。简单的说就是验证字符串是不是一段长6~20只包含数字和字母

遍历验证?

用字符串遍历对这些需求逐一验证自然是可以的,想起正则貌似有(?=pattern)正向预测先行,对于懒惰的程序员当然应该来用一下,逐一验证步骤多。

编写

有了这个思路,这个需求竟然一句正则就搞定了。再次惊艳正则的强大。

public static boolean isLegal(String str){
    String re = "^(?=.*[0-9])(?=.*[a-zA-Z])(?!.*\\W).{6,20}$";
    return str.matches(re);
}

public static void main(String[] args) {
    System.out.println(isLegal("3d11111133333"));//true
    System.out.println(isLegal("311111133333"));//false
    System.out.println(isLegal("3d1"));//false
    System.out.println(isLegal("3d11.33333"));//false
    System.out.println(isLegal("3d1194dhfaklhdfdsfasdfdsfasdfd33333"));//false
    System.out.println(isLegal("fwddfegg"));//false
}

复习下

(pattern)、(?:pattern)、(?=pattern)、(?!pattern)

(pattern)

匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在Visual Basic Scripting Edition 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '(' 或 ')'。

(?:pattern)

匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。

(?=pattern)

正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?!pattern)

负向预查,在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始


本文由 hongweipeng 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

如果对您有用,您的支持将鼓励我继续创作!