正則表達式基礎用法

正則表達式:符合一定規則的表達式,用特定符號來表達一些代碼。

    特點:用於一些特定的符號來表示一些代碼操作,這樣可以簡化書寫

    作用:專門用於操作字符串。

    優點:可以簡化對字符串的複雜操作。

    缺點:符號定義越多,正則表達式越長,閱讀性越差

正則表達式的構造摘要

1. 字符

        \\                 反斜線字符

        \t                 製表符 ('\u0009')

        \n                 新行(換行)符 ('\u000A')

        \r                 回車符 ('\u000D')

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]

        \w                       單詞字符:[a-zA-Z_0-9]

        \W                      非單詞字符:[^\w]

4、邊界匹配器

         \b                        單詞邊界

        \B                       非單詞邊界

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)

       組零始終代表整個表達式。在替換中常用$匹配組的內容。

具體操作功能:匹配、切割、替換和獲取

匹配:String  matches方法

    用規則匹配整個字符串,只要有一處不符合規則,就匹配結束,返回false。


判斷一串數字是否是手機號:手機號段只有 13xxx 15xxx 18xxxx

       public static void checkTel()

       {

              String tel = "16900001111";

              String telReg = "1[358]\\d{9}";

              System.out.println(tel.matches(telReg));

       }

判斷字符串是否是以字母開頭其餘全是數字

       public static void demo()

       {

              String str = "b23a23456789";

              String reg = "[a-zA-Z]\\d*";

              boolean b= str.matches(reg);

              System.out.println(b);

       }

判斷qq是否正確:qq5-15位,不能以0開頭,中間也不能有字母

       public static void checkQQ()

       {

              String qq = "123a454";

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

              boolean flag = qq.matches(regex);

              if(flag)

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

              else

                     System.out.println(qq+"... 不合法");

       }

切割:String split();

    多空格切割:" _+"  _表示空格 

     .點的切割:"\."操作

    \\ 切割 :"\\\\"操作

    疊詞的切割:"(.)\\1+"來操作,其中(.)是通配符,\\1代表疊一次,後面的+表示疊了多次。

實例:用 \\ 切割c:\\abc\\234\\a.doc

class RegexDemo

{

    public static void main(String[] args)

    {

    splitDemo("c:\\abc\\234\\a.doc","\\\\");

    }

    public static void splitDemo(String s,String t)

    {

        String [] arr= s.split(t);

        for(String st:arr)

        System.out.println(st);

    }

}

替換String replaceAll(regex,str);如果regex中有定義組,可以在第二參數中通過$符號獲取正則表達式中的已有的組。

    典型的寫法 str.replaceAll("(.)\\1+","$1")

實例:

public static void test_1()

{

    String str = "我我...我我...我要..要要...要要...學學學....學學...編編編...編程..程.        程程...程...程";

    /*

    將已有字符串變成另一個字符串。使用 替換功能。

    1,可以先將 . 去掉。

    2,在將多個重複的內容變成單個內容。

    */

    str = str.replaceAll("\\.+","");

    System.out.println(str);

    str = str.replaceAll("(.)\\1+","$1");

    System.out.println(str);

}

獲取:將字符串中的符合規則的子串取出。

操作步驟:

1,將正則表達式封裝成對象。            Pattern p = Pattern.compile(reg);

2,讓正則對象和要操作的字符串相關聯。  Matcher m = p.matcher(str);

3,關聯後,獲取正則匹配引擎。           while( m.find())

4,通過引擎對符合規則的子串進行操作,    {    m.group(); }               僞代碼

    比如取出。


實例:獲取ming tian jiu yao fang jia le ,da jia。 中4個字母的單詞

import java.util.regex.*;

class RegexDemo2

{

       public static void main(String[] args)

       {

              getDemo();

       }

       public static void getDemo()

       {

              String str = "ming tian jiu yao fang jia le ,da jia。";

              System.out.println(str);

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

              //將規則封裝成對象。

              Pattern p = Pattern.compile(reg);

              //讓正則對象和要作用的字符串相關聯。獲取匹配器對象。

              Matcher m  = p.matcher(str);

              while(m.find())

              {

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

                     System.out.println(m.start()+"...."+m.end());//返回索引位置

              }

       }

}

其中group(),start(),end()所帶的參數i就是正則表達式中的子表達式索引(第幾個子表達式)

用法總結:

    1.只想知道字符串對錯(判斷)用匹配

    2.將字符串變爲另一個字符串  用替換

    3.將字符串按規則獲取成多個子串  用分割

    4.想獲取字符串中的一部分  用獲取


網頁爬蟲實例:

/*

網頁爬蟲(蜘蛛)

實際上是一個功能,用於蒐集網絡上的指定信息

需求:可用於收集郵箱等信息。

應用:如通過關鍵字搜索,實際就是使用“蜘蛛”,通過查找關鍵字獲取相關的信息

*/

import java.io.*;

import java.util.regex.*;

import java.net.*;

import java.util.*;

class RegexTest2

{

    public static void main(String[] args) throws Exception

    {

       getMails_1();

    }

    public static void getMails_1()throws Exception

    {

       URL url = new URL("http://192.168.1.254:8080/myweb/mail.html");

       URLConnection conn = url.openConnection();

       BufferedReader bufIn = new BufferedReader(new InputStreamReader(conn.getInputStream()));

       String line = null;

       String mailreg = "\\w+@\\w+(\\.\\w+)+";

       Pattern p = Pattern.compile(mailreg);

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

       {

           Matcher m = p.matcher(line);

           while(m.find())

           {

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

           }

       }

    }

    /*

    獲取指定文檔中的郵件地址。

    使用獲取功能。Pattern  Matcher

    */

    public static void getMails()throws Exception

    {

       BufferedReader bufr =

           new BufferedReader(new FileReader("mail.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());

           }

       }

    }

}

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