标签:
什么是正则表达式?
正则表达式(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 的区别
标签:
原文地址:http://www.cnblogs.com/njupt-Qsimple/p/5371630.html