【JAVA正则表达式】
一、String类。
java.lang.Object
|--java.lang.String
常用方法:
|
|
|
|
|
二、Pattern类。
java.lang.Objet
|--java.util.regex.Pattern
指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher
对象,依照正则表达式,该对象可以与任意字符序列
匹配。简单来说,正则表达式在发挥作用之前要先封装为Pattern对象。它和Matcher对象配合发挥作用。
因此,典型的调用顺序是
Pattern p = Pattern.compile
("a*b"); Matcher m = p.matcher
("aaaaab"); boolean b = m.matches
();
在仅使用一次正则表达式时,可以方便地通过此类定义 matches
方法。此方法编译表达式并在单个调用中将输入序列与其匹配。语句
boolean b = Pattern.matches("a*b", "aaaaab");
构造方法:无
获取Pattern对象的方法:
|
常用方法:
|
|
|
|
|
三.Matcher类。
java.lang.Object
|-java.util.regex.Matcher
构造方法:没有。
获取该类对象的方法:
使用Pattern类的matcher方法。这是获取该类实例的唯一方法
常用方法:
|
|
|
|
|
|
|
|
|
|
|
|
四、正则表达式功能分类。
1.匹配。
实际上使用的是String类的matches方法。
|
需求:验证手机号码格式是否正确。
分析:手机号码应为11位,全部应为数字,第一个数为1,假设第二位数应当为3或5或8
则对应的模式为:1[358][0-9]{9}或者1[358]\d{9}
代码:
1 private static void checkPhoneNumber() { 2 String phone="15791916245"; 3 String regex="1[358]\\d{9}"; 4 System.out.println(phone.matches(regex)); 5 }
运行结果为true
2.切割。
实际上使用的是String类的split方法。
|
取单词练习。
(1)分隔符为若干个连续的空格。
使用的模式为:" +"
代码:
1 private static void getDanCi() { 2 String str="xiao qiang zhaosan lisi"; 3 String regex=" +"; 4 String arr[]=str.split(regex); 5 for(String s:arr) 6 System.out.println(s); 7 }
(2)分隔符为若干个连续的非空格符号,而且分隔符种类不唯一。
使用的模式为:"(.)\\1+"。.在这里代表着任意字符,而不是单纯的.,如果想要使用.切割字符串,则需要转义:\\.;其中使用了小括号代表着分组,后面\\1代表第一组,如果要使用“第一组组号1”而非单纯的数字1,需要使用\\进行转义。
组:((A)(B(C))),谁是第一组,谁是第二组?从左括号开始看并开始计数。
代码:
1 private static void getDanCi2() { 2 String str="zhangsan@@@@@lisi#####王五$$$$"; 3 String regex="(.)\\1+"; 4 String arr[]=str.split(regex); 5 for(String s:arr) 6 System.out.println(s); 7 }
3.替换
实际上使用的是String类的replaceAll方法。
|
(1).将字符串“zhangsan@@@@@@lisi&&&&&&&wangwu******zhaoliu-------”中的叠词全部变成#。
使用的模式为:"(.)\\1+"
代码:
1 private static void replaceDemo() { 2 String str="zhangsan@@@@@@lisi&&&&&&&wangwu******zhaoliu-------"; 3 String regex="(.)\\1+"; 4 str=str.replaceAll(regex, "#"); 5 System.out.println(str); 6 }
运行结果:zhangsan#lisi#wangwu#zhaoliu#
(2).将字符串“zhangsan@@@@@@lisi&&&&&&&wangwu******zhaoliu-------”中的叠词全部变成原来叠词中的单一符号。
使用的模式:同1,但是在调用repalaceAll方法的时候,第二个参数使用$1,使用$符号可以在后一个参数中使用第一个参数中的组,后面的数字代表组号。
代码:
1 private static void replaceDemo2() { 2 String str="zhangsan@@@@@@lisi&&&&&&&wangwu******zhaoliu-------"; 3 String regex="(.)\\1+"; 4 str=str.replaceAll(regex, "$1"); 5 System.out.println(str); 6 }
运行结果:zhangsan@lisi&wangwu*zhaoliu-
(3).屏蔽掉号码中的某几位数字并且以*号代替原数字。
比如:比如:18369905102变成183*****102
使用的模式:"(\\d{3})(\\d{4})(\\d{4})"
代码:
1 private static void replaceDemo3() { 2 String str="13991716243"; 3 String regex="(\\d{3})(\\d{4})(\\d{4})"; 4 str=str.replaceAll(regex, "$1****$3"); 5 System.out.println(str); 6 }
运行结果:139****6243
4.获取。
正则表达式的获取功能只能使用Pattern 类与Matcher类实现,其余均不能实现该功能。
主要使用到的方法是Matcher类的
|
|
|
两个方法。
练习:
获取"da jia hao,ming tian bu fang jia !"中由三个字母组成的单词。
使用的模式为:"\\b[a-zA-Z]{3}\\b",\b是单词边界
代码:
1 private static void getDemo1() { 2 List<String>list=new ArrayList<String>(); 3 String str="da jia hao,ming tian bu fang jia !"; 4 String regex="\\b[a-zA-Z]{3}\\b"; 5 Pattern p=Pattern.compile(regex); 6 Matcher m=p.matcher(str); 7 while(m.find()) 8 { 9 list.add(m.group()); 10 } 11 for(String s:list) 12 System.out.println(s); 13 }
运行结果:
jia
hao
jia
应当注意,如果使用了start方法与end方法,则输出为:
3:6
7:10
29:32
jia
hao
jia
start()是开始索引号,从0开始,end()是结束索引号,包含头不包含尾。