黑马程序员--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)); }} |

浙公网安备 33010602011771号