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.*"; String content = "java learning"; boolean isMatch = Pattern.matches(pattern,content); } }
|
捕获组的应用:从给定字符串查找数字串
首先创建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) ); System.out.println(m.group(1) ); System.out.println(m.group(2) ); } 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}"; 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()); } } } }
|