开发过程中,经常需要判断字符串是否符合某种规则,例如,手机号验证,身份证号验证,密码复杂度是否达到要求等。如果每次都要用一堆 if 语句来匹配规则,代码就会显得比较臃肿。
正则表达式作为Java提供给我们的一种规则判断的方式,因为对其写法的不熟悉,在以往开发过程中很少使用,现在总结一下它的用法,方便以后开发中参考使用。
废话差不多了,下面开始正式介绍:
字符串
首先第一个看下普通字符串,比如 abc ,它可以作为一个正则表达式语句使用,表示**完全匹配** abc 的字符串,看下测试代码:
String regex = "abc";
String input0 = "abc"; // 无其他内容
String input1 = "Aabc"; // 前面有其他内容
String input2 = "abcA"; // 后面有其他内容
String input3 = "AabcA";// 前后都有其他内容
String input4 = "aAbc"; // 中间有其他内容
System.out.println(Pattern.matches(regex, input0));
System.out.println(Pattern.matches(regex, input1));
System.out.println(Pattern.matches(regex, input2));
System.out.println(Pattern.matches(regex, input3));
System.out.println(Pattern.matches(regex, input4));
看下控制台的输出:
可以看到,只有完全匹配时才能返回 true
点(.)的使用
点可以代替任意单个字符使用:
regex = ".";
input0 = "#"; // 单个特殊字符
input1 = "0"; // 单个数字
input2 = "a"; // 单个字符
input3 = "20"; // 多个数字
input4 = "*A#4";// 多个字符
System.out.println(Pattern.matches(regex, input0));
System.out.println(Pattern.matches(regex, input1));
System.out.println(Pattern.matches(regex, input2));
System.out.println(Pattern.matches(regex, input3));
System.out.println(Pattern.matches(regex, input4));
可以看出,任何单个字符后可以匹配成功,多字符会返回false
星(*)的使用
* 表示0个或多个,如 “ab*” 表示 a 后面跟着 0 个或多个 b :
regex = "ab*";
input0 = "a"; // a 后面 0 个 b
input1 = "ab"; // a 后面 1 个 b
input2 = "abbbb"; // a 后面 多 个 b
input3 = "abc"; // a 后面 1个 b 后面还有其他字符
input4 = "acb"; // a 和 b 之间隔有其他字符
System.out.println(Pattern.matches(regex, input0));
System.out.println(Pattern.matches(regex, input1));
System.out.println(Pattern.matches(regex, input2));
System.out.println(Pattern.matches(regex, input3));
System.out.println(Pattern.matches(regex, input4));
加号(+)的使用
+ 表示1个或多个,如 “ab+” 表示 a 后面跟着至少一个b :
regex = "ab+";
input0 = "a"; // a 后面 0 个 b
input1 = "ab"; // a 后面 1 个 b
input2 = "abbbb"; // a 后面 多 个 b
input3 = "abc"; // a 后面 1个 b 后面还有其他字符
input4 = "acb"; // a 和 b 之间隔有其他字符
System.out.println(Pattern.matches(regex, input0));
System.out.println(Pattern.matches(regex, input1));
System.out.println(Pattern.matches(regex, input2));
System.out.println(Pattern.matches(regex, input3));
System.out.println(Pattern.matches(regex, input4));
问号(? )的使用
? 表示 0 个或 1 个:
regex = "ab?";
input0 = "a"; // a 后面 0 个 b
input1 = "ab"; // a 后面 1 个 b
input2 = "abbbb"; // a 后面 多 个 b
System.out.println(Pattern.matches(regex, input0));
System.out.println(Pattern.matches(regex, input1));
System.out.println(Pattern.matches(regex, input2));
括号的使用 () [] {}
( ) 内的内容表示的是一个子表达式,()本身不匹配任何东西,也不限制匹配任何东西,只是把括号内的内容作为同一个表达式来处理。
[ ] 表示匹配的字符在[]中,并且只能出现一次,并且特殊字符写在[]会被当成普通字符来匹配。
{ } 用来表示匹配的长度。
例如:
(ab) 表示匹配字符串 ab
[a-zA-Z0-9] 表示匹配单个字母或数字
[a-zA-Z0-9]{3} 表示匹配 3 个字母或数字
[a-zA-Z0-9]{3,6} 表示匹配 3 到 6 个字母或数字
(ab){3,} 表示出现三次以上 ab
regex = "(ab)";
input0 = "a";
input1 = "ab";
input2 = "abbbb";
System.out.println(Pattern.matches(regex, input0));
System.out.println(Pattern.matches(regex, input1));
System.out.println(Pattern.matches(regex, input2));
regex = "[a-zA-Z0-9]";
input0 = "a";
input1 = "5";
input2 = "ab";
input3 = "%";
System.out.println(Pattern.matches(regex, input0));
System.out.println(Pattern.matches(regex, input1));
System.out.println(Pattern.matches(regex, input2));
System.out.println(Pattern.matches(regex, input3));
regex = "[a-zA-Z0-9]{3,6}";
input0 = "a";
input1 = "5aF";
input2 = "fe5xGQ";
input3 = "dwkaca5F";
input4 = "dwk%";
System.out.println(Pattern.matches(regex, input0));
System.out.println(Pattern.matches(regex, input1));
System.out.println(Pattern.matches(regex, input2));
System.out.println(Pattern.matches(regex, input3));
System.out.println(Pattern.matches(regex, input4));
^ 和 $ 的使用
^ 表示开头,比如 “^[0-9]+.*”表示以数字开头
$ 表示结尾,比如 “^[0-9]$”表示纯数字
注意:方括号里用’^’表示不希望出现的字符,’^’应在方括号里的第一位。(如:”%[^a-zA-Z]%”表示两个百分号中不应该出现字母)
regex = "^[0-9]+.*";
input0 = "5a";
input1 = "56";
System.out.println(Pattern.matches(regex, input0));
System.out.println(Pattern.matches(regex, input1));
System.out.println("--------------------------");
regex = "^[0-9]+$";
input0 = "5a";
input1 = "56";
System.out.println(Pattern.matches(regex, input0));
System.out.println(Pattern.matches(regex, input1));
常用字符
\d 匹配一个数字字符,等价于 [0-9]
\D 匹配一个非数字字符,等价于 [^0-9]
\w 表示数字、26个英文字母、下划线,等价于[a-zA-Z0-9_]
\W 表示非数字、26个英文字母、下划线,等价于[^a-zA-Z0-9_]
其他常用参考:正则表达式全部符号解释
测试类完整代码:
public class Test {
public static void main(String[] args) {
String regex = "abc";
String input0 = "abc"; // 无其他内容
String input1 = "Aabc"; // 前面有其他内容
String input2 = "abcA"; // 后面有其他内容
String input3 = "AabcA";// 前后都有其他内容
String input4 = "aAbc"; // 中间有其他内容
System.out.println(Pattern.matches(regex, input0));
System.out.println(Pattern.matches(regex, input1));
System.out.println(Pattern.matches(regex, input2));
System.out.println(Pattern.matches(regex, input3));
System.out.println(Pattern.matches(regex, input4));
System.out.println("--------------------------");
regex = ".";
input0 = "#"; // 单个特殊字符
input1 = "0"; // 单个数字
input2 = "a"; // 单个字符
input3 = "20"; // 多个数字
input4 = "*A#4";// 多个字符
System.out.println(Pattern.matches(regex, input0));
System.out.println(Pattern.matches(regex, input1));
System.out.println(Pattern.matches(regex, input2));
System.out.println(Pattern.matches(regex, input3));
System.out.println(Pattern.matches(regex, input4));
System.out.println("--------------------------");
regex = "^abc";
input0 = "abcdef"; // abc 开头
input1 = "Aabc"; // 其他字符开头
System.out.println(Pattern.matches(regex, input0));
System.out.println(Pattern.matches(regex, input1));
System.out.println("--------------------------");
regex = "abc$";
input0 = "ABCabc"; // abc 结尾
input1 = "abcABC"; // 其他字符结尾
System.out.println(Pattern.matches(regex, input0));
System.out.println(Pattern.matches(regex, input1));
System.out.println("--------------------------");
regex = "ab*";
input0 = "a"; // a 后面 0 个 b
input1 = "ab"; // a 后面 1 个 b
input2 = "abbbb"; // a 后面 多 个 b
input3 = "abc"; // a 后面 1个 b 后面还有其他字符
input4 = "acb"; // a 和 b 之间隔有其他字符
System.out.println(Pattern.matches(regex, input0));
System.out.println(Pattern.matches(regex, input1));
System.out.println(Pattern.matches(regex, input2));
System.out.println(Pattern.matches(regex, input3));
System.out.println(Pattern.matches(regex, input4));
System.out.println("--------------------------");
regex = "ab+";
input0 = "a"; // a 后面 0 个 b
input1 = "ab"; // a 后面 1 个 b
input2 = "abbbb"; // a 后面 多 个 b
input3 = "abc"; // a 后面 1个 b 后面还有其他字符
input4 = "acb"; // a 和 b 之间隔有其他字符
System.out.println(Pattern.matches(regex, input0));
System.out.println(Pattern.matches(regex, input1));
System.out.println(Pattern.matches(regex, input2));
System.out.println(Pattern.matches(regex, input3));
System.out.println(Pattern.matches(regex, input4));
System.out.println("--------------------------");
regex = "ab?";
input0 = "a"; // a 后面 0 个 b
input1 = "ab"; // a 后面 1 个 b
input2 = "abbbb"; // a 后面 多 个 b
System.out.println(Pattern.matches(regex, input0));
System.out.println(Pattern.matches(regex, input1));
System.out.println(Pattern.matches(regex, input2));
System.out.println("--------------------------");
regex = "(ab)";
input0 = "a";
input1 = "ab";
input2 = "abbbb";
System.out.println(Pattern.matches(regex, input0));
System.out.println(Pattern.matches(regex, input1));
System.out.println(Pattern.matches(regex, input2));
System.out.println("--------------------------");
regex = "[a-zA-Z0-9]";
input0 = "a";
input1 = "5";
input2 = "ab";
input3 = "%";
System.out.println(Pattern.matches(regex, input0));
System.out.println(Pattern.matches(regex, input1));
System.out.println(Pattern.matches(regex, input2));
System.out.println(Pattern.matches(regex, input3));
System.out.println("--------------------------");
regex = "[a-zA-Z0-9]{3,6}";
input0 = "a";
input1 = "5aF";
input2 = "fe5xGQ";
input3 = "dwkaca5F";
input4 = "dwk%";
System.out.println(Pattern.matches(regex, input0));
System.out.println(Pattern.matches(regex, input1));
System.out.println(Pattern.matches(regex, input2));
System.out.println(Pattern.matches(regex, input3));
System.out.println(Pattern.matches(regex, input4));
System.out.println("--------------------------");
regex = "^[0-9]+.*";
input0 = "5a";
input1 = "56";
System.out.println(Pattern.matches(regex, input0));
System.out.println(Pattern.matches(regex, input1));
System.out.println("--------------------------");
regex = "^[0-9]+$";
input0 = "5a";
input1 = "56";
System.out.println(Pattern.matches(regex, input0));
System.out.println(Pattern.matches(regex, input1));
}
}