JAVA基础——正则表达式

                    正则表达式

一、概述
1.概念:符合一定规则的表达式
2.作用:用一些特定的符号来代表一些代码,操作字符串
3.好处:可以简化书写,简化对字符串的操作
4.弊端:字符定义越多,正则越长,阅读性很差

二、常见符号

[]:字符中的一个,[a-zA-Z][0-9]
. :一个任意字符
\d:数字
\w:单词字符[0-9a-zA-Z]
X?:X出现0次或者一次
X+:X出现一次或者多次
X*:X出现0次或者多次
X{n}:出现n次
X{n,}:至少n次
X{n,m}:出现n,到m次
^:行的开头
$:行的结尾
\b:单词边界
\B:非单词边界

三、几个操作

1.匹配:matches()
String类中的booleanmatches(String regex)方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。

2.切割:split():
切割lisi.zhangshan.wangwu:split(“\.”)
切割C:\abc\bc.txt时:split(“\\”)
组切割”dsfggggfwsfefff”时,split(“(.)\1+”)

    注意:按照叠词进行切割:为了让规则的结果被重用,可以用()将规则封装成一个组,每个组都有编号。对于组中所匹配的字符,可以用$n来获取。$在正则中表示行的结尾,所以出现在正则中不能用来表示组,一般用于替换中。

4.替换:replaceAll(regex,str)
“erygrgthgfffffffdgheggg”将叠词替换成单个字符:regex=”(.)\1+” str=”$1” //取第一组


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

步骤:
1.将正则表达式封装成对象
2.让正则对象和要操作的字符串相关联
3.关联后,获取正则匹配引擎
4.通过引擎对符合规则的字符串进行操作

示例:

 public static void getString(String s,String regex)    
        {    
            //将规则封装成对象。    
            Pattern p=Pattern.compile(regex);    
            //让正则对象和要作用的字符串相关联。获取匹配器对象。    
            Matcher m=p.matcher(s);    

            //System.out.println(m.matches());    
            //其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。    
            //只不过被String的方法封装后,用起来较为简单。但是功能却单一。    

            while(m.find())//find()方法是将规则作用到字符串上,并进行符合规则的子串查找。    
            {    
                System.out.println(m.group());//group()方法用于获取匹配后结果。    
                System.out.println(m.start()+"...."+m.end());    
               //start()和end()分别表示匹配字符的开始和结尾的索引    
            }    
        }    

四、几个练习
1、对IP地址段进行排序

思路:  
    还按照字符串自然顺序,只要让他们每一段都是3位即可。  
    1、按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。  
    2、将每一段只保留3位。这样,所有的ip地址都是每一段3位。

public static void IPSort1() {
        String ip = "192.168.255.1 10.0.0.1 127.0.8.2 2.2.2.2";
        //将ip的每一段补0,确保每一段至少都有3位数字
        String ip1 = ip.replaceAll("(\\d+)", "00$1");
        //保留ip的后面三位
        ip = ip1.replaceAll("0*(\\d{3})", "$1");
        //将字符串进行切割
        String[] ipa = ip.split(" +");
        //定义TreeSet集合,进行自然排序
        TreeSet<String> ts = new TreeSet<String>();
        for(String s:ipa) {
            ts.add(s);
        }


        for(String s1:ts) {
            //去掉ip段多余的0
            System.out.println(s1.replaceAll("0*(\\d+)", "$1"));
            //排序结果:2.2.2.2   10.0.0.1   127.0.8.2   192.168.255.1   
        }

2.对邮件进行校验

regex=[a-zA-z0-9_]@[a-zA-Z]+(\\.[a-zA-Z0-9]+)+”   //较为精确的匹配
regex=”\\w+@\\w+(\\.\\w+)+”    //相对不太精确的匹配

3。写一个网络爬虫

网络爬虫(蜘蛛)  
    实际上是一个功能,用于搜集网络上的指定信息  
    需求:可用于收集邮箱,qq号等之类的信息。  
    应用:如通过关键字搜索blog,实际就是使用的“蜘蛛”,通过查找关键字获取相关的blog  

//获取网页中mail    
        public static  void getWebMail()throws Exception    
        {    
            //封装网页地址    
            URL url=new URL("http://tieba.baidu.com/p/1390896758");    
            //连接服务器    
            URLConnection conn=url.openConnection();    
            //带缓冲区的网页读取流    
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));    
            String line=null;    

            //定义匹配邮件地址的正则表达式    
            String regex="\\w+@\\w+(\\.\\w+)+";    
            Pattern p=Pattern.compile(regex);//封装正则表达式    
            //读取网页数据    
            while ((line=br.readLine())!=null)    
            {    
                //正则关联数据    
                Matcher m=p.matcher(line);    
                //寻找匹配邮箱    
                while (m.find())    
                {    
                    System.out.println(m.group());//输出匹配邮箱    
                }           
            }       
        }  



 //获取指定文档中的邮件地址。使用获取功能。Pattern  Matcher    
        public static void getFileMail()throws Exception    
        {    
            //将文件封装成对象    
            File file=new File("E:\\Java Study\\Practice\\day25\\mail.txt");    
            //创建带缓冲区的读取流    
            BufferedReader br=new BufferedReader(new FileReader(file));    
            String line=null;    

            //定义正则表达式    
            String regex="\\w+@[a-zA-Z]+(\\.[a-zA-z]+)+";    
            //创建Pattern对象,封装正则表达式    
            Pattern p=Pattern.compile(regex);    

            //读取文件中数据    
            while ((line=br.readLine())!=null)    
            {       

                //关流字符串    
                Matcher m=p.matcher(line);    
                while (m.find())//寻找匹配的字符串    
                {    
                    System.out.println(m.group());//输出匹配的字符串    
                }    
            }    
        }    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值