JAVA正则表达式

正则表达式

正则表达式,用于字符串的匹配,可以控制输入和输出,实现字符串的验证,查找和替换。

常见的正则表达式

对一些正则表达式的理解

  • 限定符

1.在正则表达式的规则中,. 表示 匹配除换行符 \n 之外的任何单字符,表示零次或多次,所以 . 表示匹配任意字符匹配次或多次。
2. .* 可以匹配空字符,即开始和结尾字符中间可以没有字符,而使用 .+ 则必须保证匹配的字符串中间含有非空字符。
3.{n}表示出现n次,{n,}表示至少出现n次。

  • 贪婪匹配和懒惰匹配
     在正则表达式中,以?作为贪婪模式和懒惰模式的区别标志,例如:字符串为abaabc,懒惰模式使用“ a.*?b ”将会匹配从a开始b结束的最短字符,即ab;而贪婪模式“ a.*b ”,将会匹配从a开始b结束的最长字符串,即adaab。

正则表达式的应用

1.要使用java的正则表达式,则需要使用到java.util.regex.*包下的Pattern类和Matcher类

  • Pattern类:pattern对象就相当于一个模具,是正则表达式的编译表示
  • Matcher类:matcher对象将模具和原材料进行匹配,即对输入字符串进行解释和匹配

2.捕获组
捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。
捕获组是通过从左至右计算其开括号来编号。例如,在表达式((A)(B(C))),有四个这样的组:((A)(B(C))),(A),(B(C)),(C)

简单示例,判断字符串中是否包含特定字符串

使用Pattern.matchs(pattern,string)来比较,返回boolean值,pattern为正则表达式,string为字符串

1
2
3
4
5
6
7
8
9
import java.util.regex.*;

public class Test {
public static void main(String[] args) {
String pattern = ".*java.*"; //判断字符串中是否含有java
String content = "java learning";
boolean isMatch = Pattern.matches(pattern,content); //返回true
}
}

捕获组的应用:从给定字符串查找数字串

首先创建Pattern对象,然后通过pattern对象创建matcher对象,再使用matcher的group方法来对字符串分组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

import java.util.regex.*;

public class Test {
public static void main(String[] args) {
String pattern = "(\\D*)(\\d+)(.*)";
String content = "java learning 2020";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(content);
if (m.find( )) {
System.out.println(m.group(0) ); //java learning 2020
System.out.println(m.group(1) ); //java learning
System.out.println(m.group(2) ); //2020
} else {
System.out.println("NO MATCH");
}

}
}

对身份证的格式检测并捕获出生日期

首先对于身份证格式的验证,目前考虑的是身份证的位数和出生日期,所以使用的正则表达式为:(\d{6}[2][0][0-1][0-9][0-1][0-9][0-3][0-9]\d{3}[x])|\d{6}[2][0][0-1][0-9][0-1][0-9][0-3][0-9]\d{4}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import java.util.regex.*;

public class Test {
public static void main(String[] args) {
testID_Card();
}

public static void testID_Card() {
String[] ID = {"430422200110200048","43042220011025001x","1326465123123354222"};
String regrex = "(\\d{6}[2][0][0-1][0-9][0-1][0-9][0-3][0-9]\\d{3}[x])" +
"|\\d{6}[2][0][0-1][0-9][0-1][0-9][0-3][0-9]\\d{4}";
//改进的正则表达式,限定了7-14位的出生日期,添加了身份证最后一位为x的可能
Pattern regular = Pattern.compile(regrex);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < ID.length; i++) {
Matcher matcher = regular.matcher(ID[i]);
sb.append(ID[i]);
sb.append(" match : ");
sb.append(matcher.matches());
System.out.println(sb.toString());
sb.delete(0, sb.length());
if(matcher.matches()){
GetBirthDay(ID[i]);
}else {
System.out.println("match false,and can not get birthday\n");
}
}

}

private static void GetBirthDay(String ID) {
String pattern1 = "(\\d{6})(\\d{8})(.*)";
Pattern BirthDayRegular = Pattern.compile(pattern1);
String pattern2 = "(\\d{4})(\\d{2})(\\d{2})";
Pattern YearMonthDayRegular = Pattern.compile(pattern2);
Matcher matcher1 = BirthDayRegular.matcher(ID);
if (matcher1.matches()) {
Matcher matcher2 = YearMonthDayRegular
.matcher(matcher1.group(2));
if (matcher2.matches()) {
StringBuilder sb = new StringBuilder();
sb.append(" 出生日期为: ");
sb.append(matcher2.group(1));
sb.append(".");
sb.append(matcher2.group(2));
sb.append(".");
sb.append(matcher2.group(3));
System.out.println(sb.toString()+"\n");
sb.delete(0,sb.length());
}
}
}
}