码迷,mamicode.com
首页 > 编程语言 > 详细

java正则表达式的学习总结

时间:2016-04-09 15:25:59      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:

什么是正则表达式?

正则表达式(Regular Expression)就是用某种模式去匹配一类字符串的公式。(主要操作字符串)

解决什么问题?

如你要在一篇文章中查找第一个字是“罗”最后一个字是“浩”的三个字的姓名,即“罗*浩”;那么“罗*浩”就是公式,也称作模式(Pattern),这篇文章就是要匹配的串(或叫文本text)。再如,你要检查输入的一个字符串是否是126邮箱的格式,你得制定一个规则去查检,这种规则就是正则表达式。

其实就是定义一个规则,用来判断,查找符合此规则的字符串。简化了编程。但是可读性较差。如下一个事例

String regex = "[1-9][0-9]{4,14}";  //第一位字符1~9,后面的表示0~9的字符出现4~14次 
System.out.println("032425".matche(regex));//false,首字符为0
System.out.println("2434".matche(regex));//false,除第一个字符,只有3个字符
System.out.println("23464566".matche(regex));//true,符合规则

使用方式

1、匹配(最简单)首先定义一个regex字符串,通过使用通配符定义一种规则,再用String类的mathes方法匹配。比如

//匹配手机号码是否正确。 
String tel = "15800001111";

String regex = "1[358]\\d{9}";//第一位为1,第二位是3,5,8,\\d表示数字,\\d{9}表示数字出现9次   

boolean b = tel.matches(regex);
System.out.println(tel+":"+b);

2、切割,定义某个规则切割字符串,常用“捕获组”的概念,使用String的split方法

1 String str1 = "zhangsan xiaoqiang zhaoliu";
2 String str2 = "zhangsan      xiaoqiang      zhaoliu";//多个空格分割
3 String str3 = "zhangsan.xiaoqiang.zhaoliu";//用特殊字符"."分割
4 String str4 = "zhangsanttttxiaoqiangmmmmmmzhaoliu";//用多个重复字符分割,而且不相同
5 
6 String[] names1 = str1.split(" ");//最简单的用空格区分
7 String[] names2 = str2.split(" +");//X+表示X字符出现一次或多次
8 String[] names3 = str3.split("\\.");//由于"."在正则中是一个特殊字符,如果要用"."来做字符的话,得用转义,先转义"\"再转义".",所以双斜杠
9 String[] names4 = str4.split("(.)\\1+");//(.)捕获一个任意字符组,然后用"\\1"调用这个组,1是组编号(名称),要用双"\"转义"1"成组编号,
10                           //不然就是是字符"1“。最后"X+"表示1个或多个,叠词。以上都成功切割出来3个名字,zhangsan,xiaoqiang,zhaoliu

注意:组编号的从左边开始,按左括号的顺序分。编号需要转义

3、替换,定义一个规则,替换字符串中符合此规则的字符串,使用String的replaceAll(String regex,String arg),其中第二个参数要使用第一个参数(正则),要使用$符号

1 String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";
2 
3 str1 = str.replaceAll("(.)\\1+", "$1");//"zhangsantxiaoqiangmzhaoliu",
4                                     //在一个方法中,第一个参数是正则,第二个参数要使用第一个参数,使用$,"$1"表示获取前一个参数的第一组
5 str2 = str.replaceAll("(.)\\1+", "#");//"zhangsan#xiaoqiang#zhaoliu"

也常用应用于隐藏部分手机号之类……

1 String tel = "15800001111";
2 tel = tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");//158****1111;

4、获取,1、将正则表达式封装成对象。2、创建该正则对象的匹配器。3、通过匹配器操作字符串对象(find,group,start,end等方法)

 1 String str = "da jia hao,ming tian bu fang jia!";
 2 
 3 String regex = "\\b[a-z]{3}\\b";//"\\b"表示字符边界,表示3个字母的字符串,比如too匹配,但是tooday不是,虽然含有3个字符,但是却有五个字母
 4 
 5 //1,将正则封装成对象。
 6 Pattern p = Pattern.compile(regex);//不能new,要用静态方法返回
 7 
 8 //2, 通过正则对象获取匹配器对象。 
 9 Matcher m = p.matcher(str);
10 
11 //使用Matcher对象的方法对字符串进行操作。
12 //既然要获取三个字母组成的单词 
13 //查找。 find();
14 System.out.println(str);
15 while(m.find()){
16     System.out.println(m.group());//获取匹配的子序列
17     
18     System.out.println(m.start()+":"+m.end());
19 }//输出结果是jia hao jia

补充知识点:

对于greedy,reluctant,possessive三种数量词,区别如下

Java正则表达中Greedy Reluctant Possessive 的区别

 

java正则表达式的学习总结

标签:

原文地址:http://www.cnblogs.com/njupt-Qsimple/p/5371630.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!