1. 用法
主要是通过Pattern类,Matcher类和一个PatternSyntaxException异常类才进行操作,其中大部分操作都在Matcher类中。
1.1 校验字符串
String a = "abb123sa2wq";
String reg = "^([A-Z]|[a-z]|[0-9])*$"; //这是一个匹配字母和数字的正则表达式
Pattern pattern = Pattern.compile(reg); //Pattern说明了正则表达式的格式
Matcher matcher = pattern.matcher(a); //matcher用来匹配对应的字符串是否符合规则
System.out.println(matcher.matches()); // 如果符合规则,则是true,不符合就是false。
1.2 替换字符串
String a = "abb123sa2wq";
String reg = "^([A-Z]|[a-z]|[0-9])*$"; //这是一个匹配字母和数字的正则表达式
Pattern pattern = Pattern.compile(reg); //Pattern说明了正则表达式的格式
Matcher matcher = pattern.matcher(a); //matcher用来匹配对应的字符串是否符合规则
System.out.println(matcher.replaceAll("aaa")); // replaceAll会将匹配的内容直接替换成传入的参数。 此处输出为aaa
2. 语法
2.1 元字符
字符 | 描述 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
\w | 匹配字母、数字、下划线。 |
\W | 匹配非字母、数字、下划线。 |
\b | 匹配一个数字字符,0-9 |
\B | 匹配一个非数字字符 |
. | 匹配除了\r和\n以外的任意字符 |
基本用法:
- 匹配一个数字。(在java当中,不能直接识别 ‘\’ 符号,所以要在前面再加一个转义符号 ‘\’ 来表明下一个符号是 ‘\’ 。简单来说就是Java中所有的 ‘\’ 都要写两遍)
String reg = "^\\b"; Pattern pattern = Pattern.compile(reg); String a = "1"; System.out.println(pattern.matcher(a).matches()); // true String b = "12" System.out.println(pattern.matcher(b).matches()); // false
- 匹配一个手机号(11位)。
String reg = "^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d$"; Pattern pattern = Pattern.compile(reg); String a = "18844445567"; System.out.println(pattern.matcher(a).matches()); // true
- 匹配字符a。
String reg = "^a"; Pattern pattern = Pattern.compile(reg); String a = "a"; System.out.println(pattern.matcher(a).matches()); // true String a = "b"; System.out.println(pattern.matcher(a).matches()); // false
2.2 重复限定符
要是手机号这种限定位数的还好,如果是不限定位数的,只靠元字符就不够用了,所以有重复限定符。
字符 | 描述 |
* | 重复0次及以上 |
+ | 重复一次及以上 |
? | 重复0-1次 |
{n} | 重复n次 |
{n,} | 重复n次及以上 |
{n,m} | 重复n-m次 |
- 匹配一串数字,不限长度。
String reg = "^\\d*$"; Pattern pattern = Pattern.compile(reg); String a = "18844445567"; System.out.println(pattern.matcher(a).matches()); // true String a = "123"; System.out.println(pattern.matcher(a).matches()); // true
- 匹配一个以189开头的电话号码。
String reg = "^189\d{8}$"; Pattern pattern = Pattern.compile(reg); String a = "18944445555"; System.out.println(pattern.matcher(a).matches()); //true
- 匹配一个a开头,多个b结尾的字符串
String reg = "^ab*$"; Pattern pattern = Pattern.compile(reg); String a = "a"; System.out.println(pattern.matcher(a).matches()); // true String b = "abbb"; System.out.println(pattern.matcher(b).matches()); // true
2.3 分组
通过括号(),可以将括号内部的单位当成一个整体。
- 匹配多个ab。
String reg = "^(ab)*$"; Pattern pattern = Pattern.compile(reg); String a = ""; System.out.println(pattern.matcher(a).matches()); String b = "ababab"; System.out.println(pattern.matcher(b).matches());
- 匹配多个括号(由于括号有特殊意义,所以为了将其识别成普通括号,需要在前面加上 ‘\’ 转义,我们的 ‘\’ 符号也是如此,因为有特殊意义所以前面加上 ‘\’ 进行转义,所以是 ‘\\(’ )。
String reg = "^(\\(\\))*$"; Pattern pattern = Pattern.compile(reg); String a = "()"; System.out.println(pattern.matcher(a).matches());
2.4 条件或
匹配一批移动手机号码,用 | 进行区分。
String reg = "^(134|135|136|137|138|139|147|150|151|152|157|158|159|182|187|188)\\d{8}$";
Pattern pattern = Pattern.compile(reg);
String a = "13455556666";
System.out.println(pattern.matcher(a).matches());
2.5 字符范围
当数字太多,条件或用起来太麻烦的时候,就需要用区间[]进行划分范围。
- 数字0-9可以划分为[0-9]。
- 大写字母可以划分为[A-Z]。
- 小写字母可以划分为[a-z]。
于是刚刚的手机号可以重新写成这样
String reg1 = "^(13[4-9]|147|15[0-2]|15[7-9]|182|18[7-8])\\d{8}$";
String reg2 = "^1(3[4-9]|47|5[0-2]|5[7-9]|82|8[7-8])\\d{8}";
Pattern pattern = Pattern.compile(reg2);
String a = "13955556666";
System.out.println(pattern.matcher(a).matches());
2.6 非字符范围
在中括号的最前面加上 ^ 表示匹配不在范围内的所有字符。
匹配除了1-5开头的QQ号码。
String reg = "^([^1-5])\\d*$";
Pattern pattern = Pattern.compile(reg);
String a = "1894423";
System.out.println(pattern.matcher(a).matches()); // false;
String b = "6894423";
System.out.println(pattern.matcher(a).matches()); // true;
参考材料
正则表达式真的很骚,可惜你不会写!!! - 掘金
https://juejin.im/post/5b96a8e2e51d450e6a2de115Java
正则表达式 | 菜鸟教程
https://www.runoob.com/java/java-regular-expressions.html