一、String类。
java.lang.Object
|--java.lang.String
常用方法:
String
|
replaceAll (String regex, String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 |
String[]
|
split(String regex) 根据给定正则表达式的匹配拆分此字符串。 |
boolean
|
matches(String regex) 告知此字符串是否匹配给定的正则表达式。 |
二、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对象的方法:
static Pattern
|
compile(String regex) 将给定的正则表达式编译到模式中。 |
常用方法:
Matcher
|
matcher (CharSequence input) 创建匹配给定输入与此模式的匹配器。 |
static boolean
|
matches(String regex, CharSequence input) 编译给定正则表达式并尝试将给定输入与其匹配。该方法为Pattern类的静态方法,不需要获得Pattern类实例即可使用。 |
String
|
pattern() 返回在其中编译过此模式的正则表达式。 |
三.Matcher类。
java.lang.Object
|-java.util.regex.Matcher
构造方法:没有。
获取该类对象的方法:
使用Pattern类的matcher方法。这是获取该类实例的唯一方法
常用方法:
int
|
end () 返回最后匹配字符之后的偏移量。 |
boolean
|
find() 尝试查找与该模式匹配的输入序列的下一个子序列。 |
String
|
group() 返回由以前匹配操作所匹配的输入子序列。 |
boolean
|
matches() 尝试将整个区域与模式匹配。 |
String
|
replaceAll(String replacement) 替换模式与给定替换字符串相匹配的输入序列的每个子序列。 |
int
|
start() 返回以前匹配的初始索引。 |
四、正则表达式功能分类。
1.匹配。
实际上使用的是String类的matches方法。
boolean
|
matches(String regex) 告知此字符串是否匹配给定的正则表达式。 |
需求:验证手机号码格式是否正确。
分析:手机号码应为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方法。
String[]
|
split(String regex) 根据给定正则表达式的匹配拆分此字符串。 |
取单词练习。
(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="zhangs[email protected]@@@@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方法。
String
|
replaceAll(String regex, String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 |
(1).将字符串“[email protected]@@@@@lisi&&&&&&&wangwu******zhaoliu-------”中的叠词全部变成#。
使用的模式为:"(.)\\1+"
代码:
1 private static void replaceDemo() { 2 String str="[email protected]@@@@@lisi&&&&&&&wangwu******zhaoliu-------"; 3 String regex="(.)\\1+"; 4 str=str.replaceAll(regex, "#"); 5 System.out.println(str); 6 }
运行结果:zhangsan#lisi#wangwu#zhaoliu#
(2).将字符串“[email protected]@@@@@lisi&&&&&&&wangwu******zhaoliu-------”中的叠词全部变成原来叠词中的单一符号。
使用的模式:同1,但是在调用repalaceAll方法的时候,第二个参数使用$1,使用$符号可以在后一个参数中使用第一个参数中的组,后面的数字代表组号。
代码:
1 private static void replaceDemo2() { 2 String str="[email protected]@@@@@lisi&&&&&&&wangwu******zhaoliu-------"; 3 String regex="(.)\\1+"; 4 str=str.replaceAll(regex, "$1"); 5 System.out.println(str); 6 }
运行结果:[email protected]&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类的
boolean
|
find () 尝试查找与该模式匹配的输入序列的下一个子序列。 |
String
|
group() 返回由以前匹配操作所匹配的输入子序列。 |
两个方法。
练习:
获取"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()是结束索引号,包含头不包含尾。