黑馬程式員----Java基礎:Regex

來源:互聯網
上載者:User

標籤:java   正則   

------- android培訓、java培訓、期待與您交流! ----------

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

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

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

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

    缺點:符號定義越多,Regex越長,閱讀性越差

Regex的構造摘要

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中有定義組,可以在第二參數中通過$符號擷取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,將Regex封裝成對象。            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就是Regex中的子運算式索引(第幾個子運算式)

用法總結:

    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 = "\\[email protected]\\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 = "\\[email protected]\\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());

           }

       }

    }

}

本文出自 “點點滴滴” 部落格,請務必保留此出處http://arctictern.blog.51cto.com/10120640/1660008

黑馬程式員----Java基礎:Regex

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.