正则表达式实战
众所周知,在程序开发中,难免会遇到需要匹配、查找、替换、判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力。因此,学习及使用正则表达式,便成了解决这一矛盾的主要手段。 理论来源:http://ipjmc.iteye.com/blog/1169491 更加详细可以查出java api 1,匹配(实战案例:匹配手机号码是否正确)
public static void fun2(){ String str="13815800001"; String reg="^1[358]d{9}$"; Pattern p=Pattern.compile(reg); Matcher m=p.matcher(str); boolean flag=m.find(); //boolean flag=Pattern.compile(reg).matcher(str).find();//也可以连写,感觉高大上一点 System.out.println(flag); } 其实java api String中也提供了 matches(Stringregex) 可以直接匹配,简化了代码
public static void fun3(){ String str="13815800001"; String reg="^1[358]d{9}$"; boolean flag=str.matches(reg); System.out.println(flag); }
2,切割(实战示例1:切割中间有多个空格的字符串) public static void fun4(){ String str="zhangsan lisi wangwu"; String reg=" +"; Pattern p=Pattern.compile(reg); String[] arr=p.split(str); //String[] arr=Pattern.compile(reg).split(str); for (String string : arr) { System.out.println(string); } } 其实java api String中也提供了 split(Stringregex) 可以直接匹配,简化了代码
public static void fun5(){ String str="zhangsan lisi wangwu"; String reg=" +"; String[] arr=str.split(reg); for (String string : arr) { System.out.println(string); } }(实战示例2:切割以.的字符串 ) .是正则表达式的关键字,使用时一定记得要转义 public static void fun6(){ String str="zhangsan.lisi.wangwu"; String reg="."; String[] arr=str.split(reg); for (String string : arr) { System.out.println(string); } } (实战示例3:以重复字符串切割字符串 ) . private static void fun7() { String str="zhangsanttttttttlisimmmmmmmmwangwu kimi"; String reg="(.)1+";//這裡的括號代表组的概念,后面的n,这里是1代表获得第一个组。(.)代表一个字符串,红面使用组的引用1,表示和组1内容一样的字符串 String[] arr=str.split(reg); for (String string : arr) { System.out.println(string); } } 3,替换(实战实例1:重复字符串的替换) private static void fun8() { String str="zhangsanttttttttlisimmmmmmmmwangwu kimi"; String reg="(.)1+"; Pattern p=Pattern.compile(reg); Matcher m=p.matcher(str); //String afterStr=m.replaceAll("#"); String afterStr=Pattern.compile(reg).matcher(str).replaceAll("#"); System.out.println(afterStr); } 其实java api String中也提供了 private static void fun9(){ String str="zhangsanttttttttlisimmmmmmmmwangwu kimi"; String reg="(.)1+"; String afterStr=str.replaceAll(reg,"&"); System.out.println(afterStr); } (实战实例2:重复字符串的替换成单个字符,这个单个字符就是原来叠词的一个字符)
private static void fun10(){ String str="zhangsanttttttttlisimmmmmmmmwangwu kimi"; String reg="(.)1+"; String afterStr=str.replaceAll(reg,"$1");//这边使用$1,感觉就是引用第一组的内容,api上是这么说的:美元符号可视为到如上所述已捕获子序列的引用。 System.out.println(afterStr);//zhangsantlisimwangwu kimi } (实战实例3:把电话号码中间的四位隐去) private static void fun11(){ String str="13815867890"; String afterStr=str.replaceAll("(d{3})d{4}(d{4})","$1****$2"); System.out.println(afterStr);//138****7890 } 4,获取(实战实例:获取长度为3的子字符串) private static void fun12(){ String str = "da jia hao,ming tian bu fang jia!"; String regex = "b[a-z]{3}b"; //1,将正则封装成对象。 Pattern p = Pattern.compile(regex); //2,通过正则对象获取匹配器对象。 Matcher m = p.matcher(str); //使用Matcher对象的方法对字符串进行操作。 //既然要获取三个字母组成的单词 //查找。 find(); System.out.println(str); while(m.find()){ System.out.println(m.group());//获取匹配的子序列 System.out.println(m.start()+":"+m.end());//开始匹配的和结束匹配的位置 } } 结果为: jia
5,综合练习1(治疗口吃:我我...我我...我我我要...要要要要...要要要要..学学学学学...学学编编...编编编编..编..程程...程程...程程程 去掉重复 变成“我要学编程”) public static void test_1(){ String str = "我我...我我...我我我要...要要要要...要要要要..学学学学学...学学编编...编编编编..编..程程...程程...程程程"; //1,将字符串中.去掉。 用替换。 str = str.replaceAll(".+",""); System.out.println(str); //2,替换叠词。 str = str.replaceAll("(.)1+","$1"); System.out.println(str); } 6,综合练习2(把ip地址进行排序) public static void fun13(){ String ip_str = "192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55"; //1,为了让ip可以按照字符串顺序比较,只要让ip的每一段的位数相同。 //所以,补零,按照每一位所需做多0进行补充。每一段都加两个0. ip_str = ip_str.replaceAll("(d+)","00$1"); System.out.println(ip_str); //然后每一段保留数字3位。 ip_str = ip_str.replaceAll("0*(d{3})","$1"); System.out.println(ip_str); //1,将ip地址切出。 String[] ips = ip_str.split(" +"); TreeSet<String> ts = new TreeSet<String>();//TreeSet默认按照字符大小排序 for(String ip : ips){ // System.out.println(ip); ts.add(ip); } for(String ip : ts){ System.out.println(ip.replaceAll("0*(d+)","$1"));//把前面多余的0去掉 } } 7,综合练习3(匹配邮件) public static void fun14() { String mail = "abc1@sina.com.cn"; //String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(.[a-zA-Z]{1,3})+"; String regex = "w+@w+(.w+)+";//1@1.1 boolean b = mail.matches(regex); System.out.println(mail+":"+b); }
//本地文件爬虫(爬出文件中的所有不一样的邮件地址,并默认排序,使用TreeSet更好) private static void getEmailFromFile(){ try { BufferedReader br=new BufferedReader(new FileReader("D:email.htm")); String reg="w+@w+(.w+)+";//简单的邮件匹配规则 Pattern p=Pattern.compile(reg,Pattern.CASE_INSENSITIVE); TreeSet<String> ts=new TreeSet<String>();//默认排序,并且元素不能重复 String line=null;//保存每一行的数据 while((line=br.readLine())!=null){ Matcher m=p.matcher(line); while(m.find()){ ts.add(m.group()); } } for (String string : ts) { System.out.println(string); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } 结果为: 123456@163.com
//网络文件爬虫(按找到顺序排列,不要求去掉重复的数据 显然使用ArrayList更好) private static void getEmailFromNetFile(){ try { URL url=new URL("http://zhidao.baidu.com/link?url=WvURxC5yZGKTDD43wlnBRqsZ9RTQ845TGpK75c-We3NFyg5AUhbXDfovcSs7IhVd3ZukrASFrpFauNdpkKrZZa"); BufferedReader br=new BufferedReader(new InputStreamReader(url.openStream())); String reg="w+@w+(.w+)+"; Pattern p=Pattern.compile(reg); List<String> mList=new ArrayList<String>(); String line=null; while((line=br.readLine())!=null){ Matcher m=p.matcher(line); while(m.find()){ mList.add(m.group()); } } for (String string : mList) { System.out.println(string); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }结果为: hbboy85@126.com
本博客代码上传到:http://download.csdn.net/detail/yixiang1989/7727489 欢迎大家下载 如果有写的不到位的地方,还请大家评论指出。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |