黑马程序员--java基础之正则表达式
正则表达式:
1、概念:符合一定规则的表达式,用于操作字符串;
虽然String类中有很多方法来操作字符串,但是每个方法操作的内容太简单,如果需要对字符串进行复杂操作,需要组合简单代码,造成代码太复杂。所以操作字符串最简单的方法是正则表达式,先通过一个实例来对比。
需求如下:对QQ号码进行校验,要求5-15位,0不能开头,而且只能是数字。
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
import java.util.*; class RegularExpressions { public static void main( String [] args){ System.out.println( 0x0b ); //checkQQ_01("115708873");普通方法 //checkQQ_02("115708873");正则表达式 } //方法一:该方法利用正则表达式判断,简单很多 public static void checkQQ_02( String qq){ //定义规则 String regex = "[1-9][0-9]{4,14}" ; //调用matches方法返回boolean boolean flag = qq.matches(regex); if (flag) System.out.println( "QQ号为:" + qq); else System.out.println( "号码不合法" ); } //方法二:该方法是用字符串的简单方法进行组合来判断是否合法 public static void checkQQ_01( String qq){ int len = qq.length(); //先判定长度,长度符合则继续判断 if (len>= 5 && len<= 15 ){ //判断开头是否为0,不为0继续判断 if (!(qq.startsWith( "0" ))) { /*该注释部分是用基本的方法判断,下面有另一种比较简化的方法 /先将字符串变成字符数组 char [] chr = qq.toCharArray(); //定义一个标签 boolean flag = true; //对数组进行遍历 for (int i=0; i<chr.length ;i++ ) { //如果发现字符不符合,将标签改为false,并退出 if(!(chr[i]> '0' && chr[i]<='9')) { flag = false; break; } } //符合就执行if,不符合就执行else if(flag) System.out.println("QQ号为:" + qq); else System.out.println("非法字符,请重新输入");*/ //下面是另一种方法,将字符串变为长整型,自动判断 try { long l = Long.parseLong(qq); System.out.println( "QQ号为:" + l); } //异常处理 catch (NumberFormatException e) { System.out.println( "非法字符,请重新输入" ); } } else { System.out.println( "0不能开头" ); } } else System.out.println( "长度不符合" ); } } |
2、功能特点:用一些特定的符号来表示一些代码操作,简化书写。详细内容见java.util.regex.Pattern。
1) 匹配:String matches(regex)方法
练习一:需求:校验手机号码,13***,15***,18***
1
2
3
4
5
6
7
8
|
class RegularExpressions { public static void main( String [] args){ String tel = "13552326980" ; String regex = "1[358]\\d{9}" ; System.out.println(tel.matches(regex)); } } |
2)切割:String split(regex)方法
练习二:需求:用正则表达式切割
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
class RegularExpressions { public static void main( String [] args){ //一、切割带多空格的字符串 splitDemo( "zhangsan lisi wangwu" , " +" ); //二、切割带.的字符串。注意:.在正则表达式中代表任意字符,直接用.会返回0,无意义。 //所以必须加\代表普通符号,但是作为字符串前面必须有转义字符,所以再加一个\ splitDemo( "zhangsan.lisi.wangwu" , "\\." ); //三、切割盘符.注意:单独将\\作为切割符需要在每个\前加\来进行转义,所以共4个\ splitDemo( "C:\\abc\\bcd.txt" , "\\\\" ); //四、切割叠词前后的字符串. //注意:第一位是任意字符,用.表示,而(.)表示.被封装成组,可以被后面继续使用,\1表示调用第一组,再加转义\,+表示出现多次 splitDemo( "klaadgggaddddgj" , "(.)\\1+" ); } public static void splitDemo( String str , String regex){ String [] arr = str.split(regex); System.out.println(arr.length); for ( String s : arr){ System.out.println(s); } } } |
3)替换:String replaceAll(regex,str)方法
练习三:替换字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class RegularExpressions { public static void main( String [] args){ //一、将字符串中连续超过5个的数字替换成“#” replaceDemo( "adfa23124566757asdfadf2012" , "#" , "\\d{5,}" ); //二、将字符串中的叠词替换成"#" replaceDemo( "addfaaasdfadffff23d" , "#" , "(.)\\1+" ); //三、将字符串中的叠词变成一个.注意:$符号代表获取组中的内容,数字表示获取第几组 replaceDemo( "addfaaasdfadffff23d" , "$1" , "(.)\\1+" ); } public static void replaceDemo( String str1, String str2, String regex){ String str = str1.replaceAll(regex,str2); System.out.println(str); } } |
4)获取:将字符串中符合规则的子串取出
练习四:将字符串"ming tian jiu yao fang jia le"中含有3个或4个字符的子串取出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import java.util.regex.*; class RegularExpressions { public static void main( String [] args){ String str = "ming tian jiu yao fang jia le" ; //定义规则,\b表示单词边界 String regex = "\\b[a-z]{4}\\b" ; //获取Pattern对象,用compile方法,将规则传入 Pattern p = Pattern.compile(regex); //获取匹配器,用matcher方法,将字符串传入 Matcher m = p.matcher(str); //循环匹配,用匹配器的find方法 while (m.find()){ //获取匹配结果并打印,用匹配器的group方法 System.out.println(m.group()); } } } |
3、综合练习
练习五:需求:将下列字符串变成"我要学编程"
1
2
3
4
5
6
7
8
9
10
11
12
|
import java.util.regex.*; class RegularExpressions { public static void main( String [] args){ String str = "我我...我我我..我要....要要...要要...学学学...学学...编编编....程.程程..程程程..程...程" ; str = str.replaceAll( "\\.+" , "" ); str = str.replaceAll( "(.)\\1+" , "$1" ); System.out.println(str); } } |
练习六:需求:将下列IP地址排序 192.168.0.1 10.123.43.9 100.101.3.15 38.38.38.38
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import java.util.regex.*; import java.util.*; class RegularExpressions { public static void main( String [] args){ String str = "192.168.0.100 10.123.43.9 192.168.0.1 100.101.3.15 38.38.38.38" ; //先在每位上补2个0 str = str.replaceAll( "(\\d+)" , "00$1" ); //再保留3位数字 str = str.replaceAll( "0*(\\d{3})" , "$1" ); System.out.println(str); //切割到数组 String [] arr = str.split( " +" ); //对数组排序,或者将数组遍历后逐一添加到集合中,然后再读取集合 Arrays.sort(arr); //打印数组 for ( String s : arr) { System.out.println(s.replaceAll( "0*(\\d+)" , "$1" )); } } } |
练习七:对邮件地址进行校验,要求:@前面字母数字_,@后面字母数字,.后面字母数字
1
2
3
4
5
6
7
8
9
10
|
import java.util.regex.*; class RegularExpressions { public static void main( String [] args){ String mail = "115708873@qq.com" ; String regex = "[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+" ; //精确匹配 regex = "\\w+@\\w+(\\.\\w+)+" ; //笼统匹配 System.out.println(mail.matches(regex)); } } |