1【数量:单个】字符匹配
.:表示任意字符,即由任意字符组成;
\\: 匹配\; (重要)
\n:匹配换行;
\t:匹配制表符;
2【数量:单个】字符集(可以从里面任选一个字符)。
[abc]:表示可能是字母 a、b、c中的任意一个;
[^abc]:表示不是由字母 a、b、C中的任意一个;
[a-zA-Z]:表示由一个任意字母所组成,不区分大小写。同理加上 ^表示取反;
[0-9]:表示由一位数字所组成。同理加上 ^表示取反
3【数量:单个】简化字符集;
.:表示任意的一个字符;
\d:等价于[0-9]范围;
\D:等价于[^0-9]范围;
\s:匹配任意的一位空格,可能是空格、换行、制表符;
\S:即对\s取反匹配任意的非空格数据;
\w:匹配字母、 数字、下划线, 等价于[a-zA-Z_0-9]
\W:匹配非字母、数字、下划线,等价于[^a-zA-Z_0-9];
4【边界匹配】
^:匹配边界开始;
$:匹配边界结束;
5【数量表示】默认情况下只有添加上了数量单位才可以匹配多位字符;
表达式?:该正则可以出现 0 次或 1 次;
表达式*:该正则可以出现 0 次、1 次或多次;
表达式+:该正则可以出现 1 次或多次;
表达式{n}:表达式的长度正好为 n 次;
表达式{n,}:表达式的长度为 n 次以上
表达式{n,m}:表达式的长度在 n~m 次;
6【逻辑表达式】可以连接多个正则
表达式 X 表达式 Y:X 表达式之后紧跟上 Y 表达式;
表达式 X | 表达式 Y :有一个表达式满足即可;
(表达式):为表达式设置一个整体描述, 可以为整体描述设置数量单位。
7【理解字符 \ 的含义】
\ 在 Java 中的含义
上左下右斜杠 \ 表示转义字符。转义字符的特点使其后面的字符消失意义。比如:英文字符右下引号 " 表示字符串的结束。如果我们想把下引号输出打印,只是作为一个英文字符,消失本来的意义,我们可是使用转义字符,如下:
System.out.printf("\"");
输出结果:
"
同理,如果我们想输出打印反斜杠 \ 必须再写一个反斜杠进行转义,如下:
System.out.printf("\\");
输出结果:
\
\ 在正则表达式中的含义
将下一字符标记为特殊字符、文本(原意字符)、反向引用或八进制转义符。例如:\\匹配\
\后面接上 |
字符 |
说明 |
特殊字符 |
\d |
匹配0-9的数字 |
文本 |
\. |
匹配英文句号 |
文本 |
\\ |
匹配\ |
反向引用 |
\num |
匹配 num,此处的 num 是一个正整数。例如,"(.)\1"匹配两个连续的相同字符。 |
八进制转义符 |
\nml |
当 n 是八进制数 (0-3),m 和 l 是八进制数 (0-7) 时,匹配八进制转义码 nml。 |
例如,n 匹配字符 n。\n 匹配换行符。英文句号 . 匹配任意字符,\. 匹配英文句号 .
\ 出现在Java的正则表达式中处理
可以看出上左下右斜杠 \ 在Java中 和 正则表达式的不用含义。如果在Java中使用正则表达式,遇到反斜杠怎么处理?
给出结论:Java中两个反斜杠 \\ 表示 正则中的一个反斜杠 \
这是Java对正则表达式的支持规则,也有Python、C#、JS等语言对正则的支持规则,具体请参考 菜鸟编程
举例1:editor@csdn.cn
这是一个网址,需要用Java语言实现正则表达式进行匹配 :只用关注 \\. 这里。上面说过了,两个斜杠表示一个普通斜杠
String s = "editor@csdn.cn";
String regex = "[a-z0-9A-Z]\\w+@\\w+\\.(cn|com)"; //邮箱第一个字母不能是下划线
System.out.printf(s.matchs(regex));
举例2:ab\ab
如果在Java中要匹配上面的字符串,可以这样写:
String s = "ab\\ab";
String regex = "[a-z]{2}\\\\[a-z]{2}";
System.out.printf(s.matchs(regex));
解释一下为什么是四个反斜杠?
正则表达式在Java中应用需要符合Java规范。在Java中,两个斜杠表示一个斜杠(前一个是转义字符),因此四个斜杠匹配正则表达式中的两个斜杠;我们说在正则表达式中,两个反斜杠表示一个反斜杠,因此四个反斜杠,表示正则表达式中的一个没有意义的斜杠。
Java对正则的支持类-常用方法
java.util.regex 包中有对正则的支持类
String str = "a47";
String regex = "[a-z]\\d+";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.start());
System.out.println(matcher.end());
System.out.println(matcher.group());
// ...... Matcher里的各种匹配方法
}
start() 方法、end()方法、group()方法如果单独使用,查看源码发现会报错。需要配合 find() 方法使用。
if (this.first < 0) {
throw new IllegalStateException("No match available");
}
- find() 方法
代码示例:
public static void main(String[] args) {
String str = "ak47-ak47-CF";
String regex = "\\d+";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
System.out.println(matcher.find());
System.out.println(matcher.find());
System.out.println(matcher.find());
}
输出结果:
true
true
false
find() 方法,会从头到尾拆分字符串进行遍历,有点像迭代器,匹配正则表达式命中返回 ture。
参考: Java正则表达式中Matcher类的find方法多次调用的匹配问题
- matches() 方法
public static void main(String[] args) {
String str = "7k";
String regex = "\\d+";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
System.out.println(matcher.matches());
}
输出结果:
false
matches() 把整个字符串与正则匹配一次,并不像 find() 方法会拆分字符串进行匹配。符合就是true,否则是false。
- start() 方法
- end() 方法
public static void main(String[] args) {
String str = "ak47";
String regex = "\\d+";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println("start:"+matcher.start());
System.out.println("end:"+matcher.end());
}
}
输出结果(下标从零开始):
start:2
end:4
start() 匹配到开始位置 end()匹配到结束+1的位置。
- group() 方法
public static void main(String[] args) {
String str = "ak47-ak47";
String regex = "\\d+";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group());
}
}
输出结果:
47
47
public static void main(String[] args) {
String str = "ak47";
String regex = "([a-z]+)(\\d+)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group(0)); //也可以不带参数
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
}
}
输出结果:
ak47
ak
47
group() 即 group(0) 指的是整个正则表达式匹配结果,group(1) 指的是第一个括号里的正则匹配结果,group(2) 指的第二个括号里的正则匹配结果。
举例3:校验手机号
不会吧不会吧,不会还有人还在手写正则吧?
package cn.hutool.core.util;
PhoneUtil.isMobile(String phone);
举例4:校验身份证号码
同理
package cn.hutool.core.util;
IdcardUtil.isValidCard(String idNo);
如果要看代码实现过程,可以点击去看。