Java基礎-----正則表達式

                                            正則表達式
一、概述。
1、概念:正則表達式是符合一定規則的表達式。
2、特點:用一些特定符號來表示一些代碼操作。這樣就簡化了書寫。所以學習正則表達式就是學習一些特殊符號的使用。
3、作用:專門操作字符串的。
4、好處:可以簡化對字符串的操作。
6、弊端:符號越多閱讀性越差。
二、正則表達式一些常見的匹配規則。

1、字符
      x 字符 x
      \ 反斜線字符
      \t 製表符 (‘\u0009’)
      \n 新行(換行)符 (‘\u000A’)
      \r 回車符 (‘\u000D’)
      \e 轉義符 (‘\u001B’)

2、字符類
      [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](減去)

3、預定義字符類
      . 任何字符(與行結束符可能匹配也可能不匹配)
      \d 數字:[0-9]
      \D 非數字: [^0-9]
      \s 空白字符:[ \t\n\x0B\f\r]
      \S 非空白字符:[^\s]
      \w 單詞字符:[a-zA-Z_0-9]
      \W 非單詞字符:[^\w]

4、邊界匹配器
      ^ 行的開頭
      $ 行的結尾
      \b 單詞邊界
      \B 非單詞邊界
      \A 輸入的開頭
      \G 上一個匹配的結尾
      \Z 輸入的結尾,僅用於最後的結束符(如果有的話)
      \z 輸入的結尾

5、Greedy 數量詞
      X? X,一次或一次也沒有
      X* X,零次或多次
      X+ X,一次或多次
      X{n} X,恰好 n 次
      X{n,} X,至少 n 次
      X{n,m} X,至少 n 次,但是不超過 m 次

6、組和捕獲
捕獲組可以通過從左到右計算其開括號來編號。例如,在表達式 ((A)(B(C))) 中,存在四個這樣的組:
      1 ((A)(B(C)))
      2 \A
      3 (B(C))
      4 (C)

正則表達式功能示例:匹配,切割,替換和獲取。

package 正則表達式;

import java.io.IOException;
import java.io.InputStream;

/**
 * 
 * @author ZHANGYU
 *      正則表達式:符合一定規則的表達式。
 *      特點:用一些特定符號來表示一些代碼操作。這樣就簡化了書寫。
 *      所以學習正則表達式就是學習一些特殊符號的使用。
 *      作用:專門操作字符串的。
 *      好處:可以簡化對字符串的操作
 *      弊端:符號越多閱讀性越差。
 *  需求:對qq號進行驗證。
 *  要求:5-15位    不能0開頭     只能爲數字。
 *
 *  具體操作:
 *  1 匹配:String matches方法。用規則匹配整個字符串,只能有一處不符合規則匹配結束,返回false
 *
 */

public class test1 {

    public static void main(String[] args) throws IOException{
        String qq="123456789a";
        Check1(qq);
        check2(qq);
        check3(qq);//正則檢查qq號
        checkTel();//檢查手機號
        splitDemo("zhang.li.wang","\\.");//按照.切割
        splitDemo("zhang li   wang"," +");//按照多個空格切割。
        splitDemo("c:\\a\\d\\c.txt","\\\\");
        splitDemo("asddsjjlkwwaao","(.)\\1");//切割疊詞。爲了讓規則結果被重用,可以將規則封裝成一個組,用()完成,組的出現都有編號
        splitDemo("asddsjjjlkwwwsaao","(.)\\1+");//從1開始,想要使用已有的組可以通過,\n(n就是組編號)的形式來獲取。
        String str="sd324234df54345345fgt4343fd435234";//把字符串中的數組替換爲#
        replaceAllDemo(str,"\\d{5,}","#");//把連續5個或5個以上的數字有#代替
        String str1="sdsddwekkl";
        replaceAllDemo(str1,"(.)\\1+","#");//將疊詞替換成#

    }
    private static void replaceAllDemo(String str, String strRegx, String newstr) {
        // TODO Auto-generated method stub
        str=str.replaceAll(strRegx, newstr);
        System.out.println(str);
    }
    private static void splitDemo(String str,String strReg) {
        // TODO Auto-generated method stub
        String[] s=str.split(strReg);
        for(String i:s){
            System.out.println(i);
        }
    }
    /*
     * 匹配:
     * 手機號端有:13xxxxx    15xxxxx   18xxxxx
     */
    private static void checkTel() {
        // TODO Auto-generated method stub
        String tel="13888882134";
        String telReg="1[358]\\d{9}";
        boolean flage=tel.matches(telReg);//匹配的是整個字符。
        System.out.println("tel:"+ flage);

    }
    //判斷QQ號
    private static void check3(String qq) {
        // TODO Auto-generated method stub
        //String regex="[1-9][0-9]{4,14}";
        String regex="[1-9]\\d{4,14}";
        boolean flage=qq.matches(regex);
        if(flage==true)
            System.out.println("qq:"+qq);
        else
            System.out.println("帳號異常");
    }

    private static void check2(String qq) {
        // TODO Auto-generated method stub
        if(qq.length()>=5&&qq.length()<=15){
            if(!(qq.startsWith("0"))){
                try{
                    Long l=Long.parseLong(qq);
                    System.out.println("帳號正確");
                }catch(NumberFormatException e){
                    System.out.println("帳號只能爲數字");
                }
            }
            else{
                System.out.println("帳號開頭不能爲0");
            }
        }else
            System.out.println("帳號長度不夠");
    }

    private static void Check1(String qq) {
        // TODO Auto-generated method stub
        if(qq.length()>=5&&qq.length()<=15){
            if(!(qq.startsWith("0"))){
                char[] ch=qq.toCharArray();
                boolean flage=false;
                for(int i=0;i<ch.length;i++){
                    if(ch[i]>='0'&&ch[i]<='9')
                        flage=true;
                    else
                        flage=false;
                }
                if(flage==true){
                    System.out.println("帳號正確");
                }
                else
                    System.out.println("帳號只能爲數字");
            }
            else{
                System.out.println("帳號開頭不能爲0");
            }
        }else
            System.out.println("帳號長度不夠");
    }
}

獲取功能的示例:

package 正則表達式;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/*
 * 正則表達式的功能:獲取
 * 
 * 
 * 操作步驟:
 * 1、將正則表達式封裝成對象。
 * 2、讓正則對象和要操作的字符串相關聯。
 * 3、關聯後,獲取正則匹配引擎。
 * 4、通過引擎對符合規則的子串進行操作。比如:取出。
 */
public class test3 {

    public static void main(String[] args){
        Regx();
    }
    public static void Regx(){
        String str="hahaha lwa kd sdi d s ds ew ssd";

        String reg="\\b[a-z]{3}\\b";

        //將規則封裝成對象。
        Pattern p=Pattern.compile(reg);

        //讓正則對象和要作用的字符串相關聯。
        Matcher m=p.matcher(str);//其實String類中的matches方法,用的就是Pattern和Matcher對象來完成的
                                 //只不過被String方法封裝後,用起來較爲簡單,但是功能比較單一。
        //m.find()//將規則作用到字符串上,並進行符合規則的子串查找。
        while(m.find()){

        System.out.println(m.group());//用於獲取匹配後的結果。
        System.out.println(m.start()+"-----"+m.end());
        }

    }
}

正則表達式一些小練習。

練習一:

package 正則表達式;
/*
 * 需求:將下列字符串轉化爲:我要學編程。
 * 
 * 到底用四種功能中的那一個呢?還是那幾個呢?
 * 思路如下:
 * 1、如果只想知道字符串是對還是錯,使用匹配。
 * 2、想要用已經有的字符串變成新的字符串,替換。
 * 3、想要按照自定的方式將字符串變成多個字符串。切割,獲取規則以外的子串。
 * 4、想要拿到符合需求的字符串子串。獲取。獲取符合規則的子串。
 * 
 */
public class test4 {

    public static void main(String[] args){
        String str="我我...我我...我我...我我.......要要學學學....編編...編程...程程....程";
        /*
         * 思路:
         * 將已經有的字符串變成新的字符串用--替換。
         * 1、可以先把.去掉
         * 2、再將多個重複的內容變成單個內容。
         * 
         */
        str=str.replaceAll("\\.+", "");
        System.out.println(str);
        str=str.replaceAll("(.)\\1+", "$1");
        System.out.println(str);
    }
}

練習二:

package 正則表達式;

import java.util.TreeSet;

public class test5 {

    public static void main(String[] args){

        ipSort();
        emal();
    }

    private static void emal() {
        // TODO Auto-generated method stub
        /*
         * 對郵箱地址進行校驗
         * 
         */
        String str="[email protected]";

        String Regx="[a-zA-Z0-9_]+@[a-zA-Z0-9_]+(\\.[a-zA-Z0-9_]+)+";//較爲精確的匹配方式

        String Regx1="\\w+@\\w+(\\.\\w+)+";//相對不太精確的匹配方式


        System.out.println(str.matches(Regx));
    }

    private static void ipSort() {
        // TODO Auto-generated method stub
        /*
         * 192.168.1.254    102.49.23.013     10.10.10.10   2.2.2.2.  8.109.90.30
         * 將ip地址進行地段順序排序。
         * 
         * 還是按照字符串自然順序,只要讓它們每一段都是三位即可。
         * 1、按照每一段需要的最多的0進行補齊,那麼每一段就會至少保證有三位
         * 2、將每一段只保留三位,這樣所有的ip地址就會每一段都三位。
         */
        String ip="192.168.1.254    102.49.23.013     10.10.10.10   2.2.2.2.  8.109.90.30";

        ip=ip.replaceAll("(\\d+)", "00$1");
        System.out.println(ip);

        ip=ip.replaceAll("0*(\\d{3})", "$1");
        System.out.println(ip);

        String[] arr=ip.split(" +");

        TreeSet<String> ts=new TreeSet<String>();

        for(String s:arr)
            ts.add(s);
        for(String s:ts)
            System.out.println(s.replaceAll("0*(\\d+)", "$1"));

    }
}

練習三:獲取一些郵箱地址。

package 正則表達式;

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 test6 {

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
         getMile();
         getMile_1();

    }

    private static void getMile_1() throws Exception {
        // TODO Auto-generated method stub
        URL url=new URL("網頁地址");//封裝網頁地址  
        URLConnection conn=url.openConnection(); //連接服務器  
        BufferedReader bufr=new BufferedReader(new InputStreamReader(conn.getInputStream()));//帶緩衝區的網頁讀取流 
        String regx="\\w+@\\w+(\\.\\w+)+";
        Pattern p=Pattern.compile(regx);//創建Pattern對象,封裝正則表達式  
        String line=null;
        while((line=bufr.readLine())!=null){
            Matcher m=p.matcher(line);
            while(m.find())
            System.out.println(m.group());
        }

    }

    private static void getMile() throws Exception {
        // TODO Auto-generated method stub
        BufferedReader bur=new BufferedReader(new FileReader("mail.txt"));
        String line=null;
        String regx="\\w+@\\w+(\\.\\w+)+";
        Pattern p=Pattern.compile(regx);
        while((line=bur.readLine())!=null){
            Matcher m=p.matcher(line);
            while(m.find())
            System.out.println(m.group());
        }
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章