java笔记31 正则表达式

1.       正则表达式

       正则表达式:获取符合一定规则的字符串的方式

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

        特点:用一些特定的符号表示一些代码操作,简化书写

                           学习特殊符号的使用

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

        弊端:阅读性较差

2.        具体操作功能

1、匹配

                 String matches方法

                 [abc] a、b 或 c(简单类)

                                    某一位只能是a或者b或者c

                   [^abc] 任何字符,除了 a、b 或 c(否定)

                                     某一位除去a、b、c

                   [a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)

                   [a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)

                                     并集

                   [a-z&&[def]] d、e 或 f(交集)

                   [a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)

                   [a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)

 

                 . 任何字符(与行结束符可能匹配也可能不匹配)

                   \d 数字:[0-9]

                                     要用

                   \D 非数字: [^0-9]

                   \s 空白字符:[ \t\n\x0B\f\r]

                   \S 非空白字符:[^\s]

                   \w 单词字符:[a-zA-Z_0-9]                                     

                   \W 非单词字符:[^\w]

         示例        

 public static void checkNum(String qq)

    {

        String regex="[1-9]\\d*";//数字1-9,至少有一位

        boolean flag=qq.matches(regex);

        if(flag)

            System.out.println(qq+"...ok");

        else

            System.out.println(qq+"....非法");

    }

    public static void checkTel(String tel)

    {

        /*

            匹配手机号段

         */

        String regex="1[358]\\d{9}";//1开头,第二位是358,后面还有9位数字

        boolean flag=tel.matches(regex);

        if(flag)

            System.out.println(tel+"...ok");

        else

            System.out.println(tel+"....非法");

    }

}


 

2、切割

                   不能直接用“.”  点号表示任意字符

                 要加两个反斜杠  \\

                          splitDemo("C:\\abc\\a.txt","\\\\");// \\表示一个反斜杠

                 (.)\\1

捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:

                   1     ((A)(B(C)))

                   2     \A

                   3     (B(C))

                   4     (C)

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

public class H_01RegexDemo {

    public static void main(String[] args) {     

        splitDemo("C:\\abc\\a.txt","\\\\");// \\表示一个反斜杠

        splitDemo("derkkserqquisedooo","(.)\\1+");//  \\1表示重复第一个组即按照连续字符切割 至少两个

    }

    public static void splitDemo(String str,String reg)

    {

        //按照多个空格切割

        String []arr=str.split(reg);

        for(String s:arr)

        {

            System.out.println(s);

        }

    }

}


         结果:

                   C:

abc

a.txt

der

ser

        

         3、 替换示例

public class H_04RegexReplace {

    public static void main(String[] args) {

   

        String str="wer34343536ininiji15201972323";

        replaceAllDemo(str,"\\d{5,}","#");//至少5个数字的,用#替换

        replaceAllDemo("derkkserqquisedooo","(.)\\1+","&");//重复元素用&替换

        replaceAllDemo("derkkserqquisedooo","(.)\\1+","$1");//使用$符号获取组成员 去除重复元素     

    }  

    public static void replaceAllDemo(String str,String reg,String newstr)

    {

        str=str.replaceAll(regnewstr);//符合reg要求的,用newstr替换

        System.out.println(str);

    }

}


结果:

wer#ininiji#

der&ser&uised&

derkserquisedo

 

         4、 获取功能

获取功能

 将字符串中符合规格的子串取出               

 操作步骤

 1、将正则表达式封装成对象

 2、让正则表达式关联字符串

 3、关联后,获取正则匹配引擎

 4、通过引擎对符合规则的紫船进行操作,比如取出。

import java.util.regex.*;

public class H_05RegexGet {

    public static void main(String[] args) {

        getDemo("jin tian  tian qi  bu cuo  ming  tian  ");

    }  

    public static void getDemo(String str)

    {

        String reg="\\b[a-zA-Z]{3}\\b";//连续3个字母

        //将规则封装成对象

        Pattern p=Pattern.compile(reg);

        //让正则对象和药作用的字符串相关联,获取匹配器对象

        Matcher m=p.matcher(str);

        //String 中的matches方法就是调用了 Pattern和Matcher对象来完成的

        //m.find();//将规则作用到字符串上,并进行判断

        while(m.find())

        {

            System.out.println(m.group());

            System.out.println(m.start()+"  "+m.end());

            //返回子串的索引位置        

        }      

    }

}


结果:

jin

0  3

cuo

22  25

3.       练习:

IP地址排序

        

import java.util.TreeSet;

public class H_06RegexTest {

    public static void main(String[] args) {

        ipDemo("192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30");

    }  

    public static void ipDemo(String str)

    {

        str=str.replaceAll("(\\d+)""00$1");//1位或多位数字,前面补0

        str=str.replaceAll("0*(\\d{3})""$1");//前面是0个或者多个0,后面3位,替换为后面三位

        String [] arr=str.split(" +");//用一个或者多个空格切割

        TreeSet<String> ts=new TreeSet<String>();//直接存入TreeSet集合

        for(String s:arr)

        {

            ts.add(s);

        }

        for(String s:ts)

        {

            System.out.println(s.replaceAll("0*(\\d+)""$1"));//替换成不带零的,并打印

        }

    }

}


结果

2.2.2.2

8.109.90.30

10.10.10.10

102.49.23.13

192.68.1.254

 

4.       网页爬虫

需求

         获取指定文档中的邮件地址

         使用获取功能  Patten  Matcher

import java.io.BufferedReader;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.InputStreamReader;

import java.net.MalformedURLException;

import java.net.URL;

import java.net.URLConnection;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class H_08Spider

{

    public static void main(String[] argsthrows Exception

    {

        getMail();

    }

    public static void getMail() throws Exception

    {

        URL url=new URL("http://tieba.baidu.com/p/2901562330");//地址封装

        URLConnection conn=url.openConnection();//返回一个 URLConnection 对象

        //conn.getInputStream()返回从此打开的连接读取的输入流。

        BufferedReader bufIn=new BufferedReader(newInputStreamReader(conn.getInputStream(),"utf-8"));

        String line=null;

        //String reg="[\\W&&[\\S]]+";

        //String reg="[\u4E00-\u9FA5]+";//汉字编码范围 可以获取汉字

        String reg="\\w+@\\w+(\\.\\w+)";//定义获取邮箱的正则表达式

        Pattern p=Pattern.compile(reg);    

        while((line=bufIn.readLine())!=null)

        {

            Matcher m=p.matcher(line);

            while(m.find())

            {

                System.out.println(m.group());

            }

        }      

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值