正则表达式

第2章 正则表达式

1、概述

⑴、正则表达式:是一种专门用来操作字符串的规则,通过一些符号来表示某些程序代码,简化对字符串的复杂操作,但可读性较差。

⑵、由来:对字符串的操作,如果用代码会显得臃肿,而利用正则就能将其简化,

publicclass RegexFrom {

  /**

   * 需求:校验qq号码

   *     长度为5-15位,只能是数字,0不能开头。

   */

  publicstaticvoid main(String[] args) {

         String qq = "45446554l";

         CheckQQ(qq);

         //上面的方法太麻烦,于是出现了正则表达式

         String regex = "[1-9]{4,14}";

         boolean b = qq.matches(regex);

         System.out.println(qq+"::"+b);

  }

  privatestaticvoid CheckQQ(String qq) {

      int len = qq.length();

      if(len<15&&len>5){

          if(!qq.startsWith("0")){

              try {

                  long l = Long.parseLong(qq);

              }catch(NumberFormatException e) {

                  System.out.println("含有非法字符");

              }                              

          }else{

              System.out.println("不能以0开头");

          }

      }

     else{

          System.out.println("长度错误");

      }          

  }

}

2、常见的符号

⑴、Greedy 数量词

X?      X,一次或一次也没有

X*      X,零次或多次

X+      X,一次或多次

X{n}    X,恰好 n 次

X{n,}   X,至少 n 次

X{n,m}  X,至少 n 次,但是不超过 m 次

⑵、边界匹配器

^  行的开头

$  行的结尾

\b 单词边界

⑶、字符类

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

[^abc]          任何字符,除了 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

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

3、常见操作

    ⑴、匹配:String类中的matches方法  matches(regex)

publicstaticvoidmatchFunction() {

      Stringtel = "134989879789";//任意一个号码

      Stringreg = "1[358]\\d{9}";//定义规则

      boolean b = tel.matches(reg);

      System.out.println(b);

    ⑵、获取的步骤

①、将正则规则封装成对象

             Pattern p =Pattern.compile("a*b");

         ②、通过正则对象的Matcher方法与字符串相关联,获取要对字符串操作的匹配器对象Matcher

             Matcherm = p.matcher("aaaaab");

         ③、通过Matcher匹配器对象的方法对字符串进行操作

 boolean b= m.matches();

publicstaticvoid function() {

        Stringstr = "dajia hao, ming tian bu fang jia";

        Stringregex = "\\b[a-z]{3}\\b";//拿三个字符

        Patternp = Pattern.compile(regex);

        Matcherm = p.matcher(str);

        while(m.find()){

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

        }

        }

    ⑶、切割:String中的split()    spilt(regex)实现复杂切割(连词、叠词)

publicstaticvoidsplitFunction() {

      Stringstr = "zhangsan....lisi    wangwu";

      //String[] names=str.split("\\.+");//.是一个预定义字符类,只有通过两次转义

//想要复用,用()将其封装,然后利用\\加一个数字来表示组标号

      String[]names =str.split("(.)\\1+");

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

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

      //2     \A

      //3     (B(C))

      //4     (C)

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

      for (String name : names) {

          System.out.println(name);

      }

  }

    ⑷、替换:replaceAll(regex,str);

publicstaticvoidreplaceAllFunction(){

      Stringstr = "15800001111";

//$:获取组,如$1获取的是(\\d{3})

      str= str.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");

      System.out.println(str);

}

4、网页爬虫:通过网络以及IO读取网页源文件,并通过规则获取网页中符合规则的数据。

privatestatic List<String> getMailsByWeb() throws IOException {

        //1.1、这是一个爬本地文件的程序,首先读取源文件

   //  BufferedReader bufr = newBufferedReader(new FileReader(""));

        //1.2、这是一个爬网页的程序,首先读取源文件

        URLurl = new URL("http://19901111.blog.51cto.com/6838239/1246992");

        BufferedReaderbufIn = newBufferedReader(new InputStreamReader(url.openStream()));

        //2、对读取的数据进行规则的匹配。从中获取符合规则的数据

        Stringmail_regex = "\\w+@\\w+\\.\\w+";

        //3、将符合规则的数据存储到集合中

        List<String>list = newArrayList<String>();

        Pattern p = Pattern.compile(mail_regex);

        String line = null;

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

            Matcherm = p.matcher(line);

            while(m.find()){

                list.add(m.group());

            }

        }  

        return list;

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值