一.概述
正则表达式是一种强大而灵活的文本处理工具,是一种简洁,动态的语言,正则表达式提供了一种完全通用的方式,能够解决各种字符串处理相关的问题,匹配,分割,替换,获取等操作。
当然可以使用if-else对字符串进行数次麻烦的判断来获取自己想要的数据,但是这样做的唯一好处就是增加了自己无谓的代码量。
二.语法
语法在java的API中被列举的十分清楚,因此这里只是列举几个感觉常用的知识点
1.字符
x------------字符x
\\------------反斜线字符
2.字符类
[abc] |
a、b或c(简单类) |
[^abc] |
任何字符,除了a、b或c(否定) |
[a-zA-Z] |
a到z或A到Z,两头的字母包括在内(范围) |
[a-d[m-p]] |
a到d或m到p:[a-dm-p](并集) |
[a-z&&[def]] |
d、e或f(交集) |
[a-z&&[^bc]] |
a到z,除了b和c:[ad-z](减去) |
[a-z&&[^m-p]] |
a到z,而非m到p:[a-lq-z](减去) |
3.预定义字符类
.----------------任意字符
\d----------------数字[0-9]
\D----------------非数字[^0-9]
\s----------------空白字符[\t\n\x0B\f\r]
\S----------------非空白字符[^\s]
\w----------------单词字符[a-zA-Z_0-9]
\W----------------非单词字符[^\w]
4.数量词
X? |
X,一次或一次也没有 |
X* |
X,零次或多次 |
X+ |
X,一次或多次 |
X{n} |
X,恰好n次 |
X{n,} |
X,至少n次 |
X{n,m} |
X,至少n次,但是不超过m次 |
三.用途
1.匹配
匹配即String的matches方法,使用该方法可以判定一个字符串是否符合自己所编写的正则表达式。
例如:
①匹配QQ号,长度是5-15无其他字符。
//校验QQ号,长度是5~15,不以0开头,不含其他字符 String qqReg = "[1-9]\\d{4,11}"; String qq = "384090944";//测试数据 //使用String的matches进行校验 System.out.println(qq.matches(qqReg));
②匹配手机号,长度11,可以是13151618开头
//匹配手机号 String telReg = "1[3|5|6|8][0-9]{9}"; String tel = "18234034895";//测试数据 System.out.println(tel.matches(telReg));
2.分割
分割即String的split方法,使用该方法可以对调用该方法的字符串按照参数正则表达式进行分割,返回一个字符串。
①按照重叠空格分割,返回有效数据
// 将三个字符提取出来 String str = "lisi zhangsan wangwu"; String[] ds = str.split(" +"); for(String d:ds) { System.out.println(d); }
②按照重叠字母进行分割,返回有效数据
//根据叠词进行分割 String str2 = "lisimmmmmmmmzhangsanyyyyyyyywangwu"; String[] ds2 = str2.split("(.)\\1+"); for(String d:ds2) { System.out.println(d); }
3.替换
在String中,可以使用replace,replaceAll对字符串中的某些子字符串进行替换操作。
①将叠词替换为#号
//将叠词替换为# String str = "lisiwwwwwweeeeeewangjiiiiiiizhangsannnn"; String newStr = str.replaceAll("(.)\\1+","#"); System.out.println(newStr);
②将叠词替换为叠词的一个
//将叠词替换为一个 String newStr2 = str.replaceAll("(.)\\1+","$1"); System.out.println(newStr2);
③屏蔽手机号码的中间四位
//手机号码中间四位进行屏蔽 String tel = "18234034895"; tel = tel.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2"); System.out.println(tel);
4.获取
String类中的有关正则表达式的方法只能完成简单的功能,如果想完成更加发杂的功能,这个时候就需要正则表达式的实例对象pattern,Pattern是对正则表达式的一个封装,可以通过Pattern.compile方法将一个正则表达式封装成一个对象,然后通过matcher方法获取匹配器对象Matcher,在Matcher中有很多丰富的针对字符串进行操作的方法。
①获取三个字母组成的单词
<span style="white-space:pre"> </span>//1.将这则规则进行对象的封装 Pattern p = Pattern.compile("\\b[a-z]{3}\\b"); Matcher m = p.matcher("jia jihwjl h llo ha hi a"); while(m.find()) { System.out.println(m.group(0)); }
5.组(group)
组是用括号划分的正则表达式,可以根据组的编号来引用某一个组,组号为0表示整个表达式,组号1表示被第一队括号括起的组
例如:A(B(C))D
第0组:ABCD
第1组:BC
第2组:C
四.练习题
1.治疗口吃
//治疗口吃 String str = "我....我我...我我...我...我...我我要要..要要..要..要吃吃..吃...吃饭饭.....饭...饭饭"; //1.将.字符去掉 String str1 = str.replaceAll("\\.",""); System.out.println(str1); //2.将叠词替换为一个 String result = str1.replaceAll("(.)\\1+","$1"); System.out.println(result);
2.IP地址排序
//对ip地址排序 String ip_str = "127.0.0.1 192.168.1.100 3.4.56.2 122.34.2.1"; //1.将所有的ip字段前加两个0 ip_str = ip_str.replaceAll("(\\d+)","00$1"); //2.将字段保留后三个数字 ip_str = ip_str.replaceAll("0*(\\d{3})","$1"); //对ip_str进行分割 String[] ips = ip_str.split(" +"); //通过遍历将ip存储到集合TreeSet中,具有排序效果 Set<String> set = new TreeSet<String>(); for(String ip : ips) { set.add(ip); } for(String ip : set) { //由于\\d+ 必须至少是一次 因此000 在匹配的时候 0*对应前两个0 而\\d+对应最后一个0 因此000 被替换成了0 System.out.println(ip.replaceAll("0*(\\d+)","$1")); }
3.邮箱验证
//邮箱验证 String mail = "3840909wjl@qq.com.cn"; String reg = "[a-zA-Z0-9_]+@[a-zA-Z]+(\\.[a-zA-Z0-9]{1,3}){1,3}"; //验证true为合法,false非法 System.out.println(mail.matches(reg));
4.网页爬虫
//网页爬虫 //1.源,使用URL技术获取网络资源 URL url = new URL("http://www.haosou.com/s?psid=5f3cf926a6c37704410d1aff0ba15538&q=邮箱地址大全&src=srp_suggst_3.1&fr=hao_isearch2_ad_1"); URLConnection conn = url.openConnection(); BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); //2.声明邮箱正则表达式 String mailReg = "[a-zA-Z0-9_]+@[a-zA-Z]+(\\.[a-zA-Z0-9]{1,3}"; //3.将正则表达式封装成一个对象 Pattern p = Pattern.compile(mailReg); //4.从源读取数据进行爬取 String line = null; StringBuilder sb = new StringBuilder(); while((line = in.readLine()) != null) { sb.append(line); } String data = sb.toString(); Matcher m = p.matcher(data); //声明一个集合将邮箱存储到集合中 List<String> mails = new ArrayList<String>(); while(m.find()) { String mail = m.group(); mails.add(mail); System.out.println(m.group()); }