黑马程序员--正则表达式笔记

来源:互联网 发布:搜狐视频下载软件 编辑:程序博客网 时间:2024/06/06 17:14
----------------------android培训、java培训、期待与您交流! ----------------------

正则表达式基础知识

定义:符合一定规则的表达式

作用:由于专门操作字符串。

特点:用于一些特定的符号来表示一次代码,这样做简化书写。

好处:可以简化对字符串的复杂操作。

弊端:符号定义越多,正则越长,阅读性越差。

所以说学习正则表达式,就是学习一些特殊符号的使用。


具体操作功能

1.匹配:String  matches方法

2.切割:String split方法

3.替换:String replaseAll方法

在替换过程中在组的外面可以$来用前面的组,比如replaceAllDemo(str,"(.)\\1+","$1"); 后面的$1就是引用的前面的组中的内容
解释   replaceAllDemo(String str,String reg,String newStr)
         {//去字符串中连续重复的字符替换为一个该字符。
             str= str.replaceAll(reg,newStr);
           }

注意

"."->"\\."
叠词-->"(.)\\1+"   用括号括()起来则将封装成一个组。组的出现都是有编号的,编号从1开始
想要使用组可以通过\n (n就是组的编号)的形式来获取。
怎么区分几个组?从左向右从1开始数左括号,是几则这个组的编号就是几.
在表达式 ((A)(B(C))) 中,存在四个这样的组: 

1     ((A)(B(C))) 
2     \A 
3     (B(C)) 
4     (C) 

组零始终代表整个表达式。 


4.获取:将字符串中符合规则的子串取出

操做步骤
1.将正则表达式封装成对象
2.让正则对象和要操作的字符串相关联。
3关联后,获取正则匹配引擎。
4.通过引擎对符合规则的子串进行操作,比如取出。
例子
import java.util.regex.Matcher;import java.util.regex.Pattern;public class RegexDemo {/**获取:将字符串中符合规则的子串取出 * 操做步骤 *1.将正则表达式封装成对象 *2.让正则对象和要操作的字符串相关联。 *3关联后,获取正则匹配引擎(匹配器)。 *4.通过引擎对符合规则的子串进行操作,比如取出。 * @param args */public static void main(String[] args) {getDemo();}public static void getDemo(){String str= "ming tian jiu yao fang jia le. ";String reg= "\\b[a-z]{3}";// \\b是单词边界匹配//将规则封装为对象;Pattern p = Pattern.compile(reg);//让正则对象和要操作的字符串相关联。获取匹配器。Matcher m = p.matcher(str);System.out.println(m.matches());//其实String类matchers用的就是Pattern和Matcher对象来完成的//只不过被String的方法封装后,用起来较简单,但是功能却单一。//Boolean b = m.find();//将规则作用到字符串上,并进行符合规则的子串查找。//System.out.println(b);//System.out.println(m.group());//用于获取匹配后的结果。while (m.find()){System.out.println(m.group());}}}



这四种功能如何选择呢?

思路方式
1.如果只想知道该字符是否是对是错。使用匹配
2.想要将已有的字符串变成另一个字符串,替换
3.想要按照自定的方式将字符串变成多个字符串,切割。获取规则以外的子串。
4.想要拿到符合需求的字符串子串,获取。获取符合规则的子串


练习


将ip地址进行地址段顺序排序

 192.68.1.254  102.49.23.13  10.10.10.10  2.2.2.2  8.109.90.30
思路
还按照字符串自然顺序,只要将它们的每一段都是三位即可。
1.按照每一段粗腰的最多的0补齐,那么每一段就会至少保证有三位。
2.将每一位只保留三位。这样,所有的ip地址都是每段三位。


import java.util.TreeSet;public class IPSortDemo {/**将ip地址进行地址段顺序排序 192.68.1.254  102.49.23.13  10.10.10.10  2.2.2.2  8.109.90.30思路还按照字符串自然顺序,只要将它们的每一段都是三位即可。1.按照每一段粗腰的最多的0补齐,那么每一段就会至少保证有三位。2.将每一位只保留三位。这样,所有的ip地址都是每段三位。 * @param args */public static void main(String[] args) {// TODO Auto-generated method stubipsort();}public static void ipsort(){String ip ="192.68.1.254  102.49.23.13  10.10.10.10  2.2.2.2  8.109.90.30";String rex ="\\d+";ip= ip.replaceAll("(\\d+)", "00$1");System.out.println("ip::"+ip);//ip::00192.0068.001.00254  00102.0049.0023.0013  0010.0010.0010.0010  002.002.002.002  008.00109.0090.0030ip=ip.replaceAll("0*(\\d{3})", "$1");System.out.println("ip1::"+ip);String [] arr = ip.split(" +");TreeSet<String> ts =new TreeSet<String>();for(String s: arr){//去零s=s.replaceAll("0*(\\d+)", "$1");System.out.println(s);}}}


-----------------------------------------------------

从文件获取邮件地址代码


import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.util.regex.Matcher;import java.util.regex.Pattern;public class getMailTest {/**网页爬虫 * 获取指定文档的邮箱地址 * 使用正则表达式的获取功能 。Pattern Matcher * @param args * @throws Exception  */public static void main(String[] args) throws Exception {getMail();}public static void getMail() throws Exception{BufferedReader bufr = new BufferedReader(new FileReader("c:\\abc.txt"));String line = null;String mailReg ="\\w+@\\w+(\\.\\w+)+";Pattern p =Pattern.compile(mailReg);while((line=bufr.readLine())!=null){Matcher m = p.matcher(line);while(m.find())System.out.println(m.group());}}}


----------------------android培训、java培训、期待与您交流! ----------------------
原创粉丝点击