正則表達式

---------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ----------------------

正則表達式

    定義:符合一定規則的表達式。

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

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

    所以學習正則表達式,就是在學習一些特殊符號的使用。

    好處:可以簡化對字符串的複雜操作。

    弊端:符號定義越多,正則越長,閱讀性越差。

 

    正則表達式常用符號:

        一、字符:

            字符x

           \\    反斜線字符

           \t    製表符

           \n    換行符

           \f    換頁符

           \r    回車符

        二、字符類:

            [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](並集)

        三、預定義字符類:

           .     任何字符(與行結束符可能匹配也可能不匹配)

            \d     數字: [0-9]

            \D           非數字:  |^[0-9]

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

            \S            非空白字符:[^ \t\n\x0B\f\r]

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

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

        四、邊界匹配器:

            ^      行的開頭

            $             行的結尾

            \b            單詞邊界

            \B            非單詞邊界

            \A            輸入的開頭

        五、Greedy數詞量---->匹配整個字符串:

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

            X*                    X,零次或多次

            X+                   X,一次或多次

            X{n}                 X,恰好n

            X{n,}                X,至少n

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

        六、組和捕獲:

            捕獲組可通過從左到右計算其開括號來編號。

    正則表達式主要有四種具體功能:匹配、切割、替換和獲取。

        1、匹配:String matches方法。   用規則匹配整個字符串,只要有一處不符合規則,就匹配結束,返回false

           代碼事例,如下:

                class  RegexDemo{

                       public static voidmain(String[] args){

                               checKtel(); //調用匹配手機號碼的方法

                              checKqq(); //調用匹配QQ號碼校驗方法

                    }

                    //匹配手機號段只有 13xxx 15xxx18xxx

                      publicstatic void checKtel(){

                               Stringtel="13000015247";    //輸入任意號碼看是否滿足要求

                              StringtelReg="1[358]\\d{9}";      //通過正則字符進行匹配

                              System.out.println(tel.matches(telReg));       //通過matches方法打印

                      }

                      /*

                          對QQ號碼進行校驗

                          要求:5~15  0不能開頭,只能是數字

                      */

                      publicstatic void checKqq(){

                               Stringqq="123456";     //輸入號碼看是否滿足要求

                              //第一個號碼1-9範圍,第二號碼\\d是0-9的範圍,{4,14}意思是第一個確定了,最少還需要舒服4個號碼,最多輸入14個                     //號碼了

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

                              booleanflag=qq.matches(regex);     //判斷是否滿足regex,是執行if,否執行else

                              if(flag){

                                         System.out.println(qq+"...正確的");

                              }else{

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

                          }

                    }

                }

        2、切割:String split();

            代碼事例,如下:

                class RegexDemo1{

                      publicstatic void main(String[] args){       

                               splitDemo_1();      //無參數的

                              splitDemo("zhangsan.lisi.wangwu","\\.");       //通過\\.中的點進行切割

                              splitDemo("c:\\abc\\a.txt","\\\\");    //通過\\\\進行切割

                              splitDemo("erkktyqqquizzzzzo","(.)\\1+");      //按照疊詞完成切割。爲了可以讓規則的結果被重用

                                                                                                                //可以將規則封裝成一個組。用()完成。組的出現都有編號。

                                                                                                            //從1開始。想要使用已有的組可以通過  \n(n就是組的編號)的形式來獲取。   

                       }

                       public static voidsplitDemo(Stringstr,String reg){         //有參數

                              String[]arr=str.split(reg);       //調用split方法

                              System.out.println(arr.length);    //打印切割個數

                              for(String s: arr){       //用高級for循環進行切割

                                         System.out.println("切割"+s);

                               }

                      }

                      publicstatic void splitDemo_1(){  //無參數

                              Stringstr="zhangsan  lisi  wangwu";

                              Stringreg=" +";   //按照多個空格切割

                              String[]arr=str.split(reg);       //調用split方法

                              System.out.println(arr.length);    //打印切割個數

                              for(String s: arr){

                                         System.out.println("切割1"+s);//用高級for循環進行切割

                              }

                      }

                }

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

            代碼事例,如下:

                classRegexDemo2{

                       public static voidmain(String[] args){

                               Stringstr="asdassada156465465sdfas454sf1";

                                  //把str中的內容用"\\d{5,}"方法替換成#

                                  //"\\d{5,}"意思是\d是在0到9內,{5,}意思是五位以上。所以"\\d{5,}"是五位以上0到9的數字都替換成一個#

                              replaceAllDemo(str,"\\d{5,}","#"); //將字符串中的數字替換成#

                              Stringstr1 ="erkktyqqquizzzzzo";

                              replaceAllDemo(str1,"(.)\\1+","#");    //將疊詞替換成#.

                              replaceAllDemo(str1,"(.)\\1+","$1");       //將重疊的字符替換成單個字母。zzzz->z 用替換符$1

                      }

                        //str本來的內容。reg規則,就是給定的方法 。newStr替換的內容

                       public staticvoidreplaceAllDemo(String str,String reg,String newStr){

                               str=str.replaceAll(reg,newStr);    //用替換方法進行替換

                              System.out.println("替換過的str的內容:"+str);//打印內容

                       }

                }

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

            操作步驟:

                1、將正則表達式封裝成對象。

                2、讓正則對象和要操作的字符串相關聯。

                3、關聯後,獲取正則匹配引擎。

                4、通過引擎對符合規則的子串進行操作,比如取出。

            代碼事例,如下:

                importjava.util.regex.*;

                class RegexDemo3{

                       public static voidmain(String[] args){

                               getDemo();

                      }

                      publicstatic void getDemo(){

                               String str="mingtian  jiu yao qu shang xue le";   //定義字符串

                              System.out.println("str");     //先打印一次字符串

                              Stringreg="\\b[a-z]{4}\\b";   //定義方法滿足要求就獲取出來

                                  //Pattern類沒有構造方法不能創建對象,只能用方法調用封裝成對象.

                              Patternp =Pattern.compile(reg);

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

                              Matcherm =p.matcher(str);

                            while(m.find()){        //循環子串查找

                                         System.out.println(m.group());     //用於獲取匹配後結果並打印

                                         System.out.println(m.start()+"...."+m.end());      //打印切割的字符串所在位置順序,包含頭不包含尾

                              }

                       }

                }

    那怎麼來靈活運用這四種功能呢?

       思路方式:

           1、如果只想知道該字符是否對是錯,使用匹配。

           2、想要將已有的字符串變成另一個字符串,替換。

           3、想要按照自定的方式將字符串變成多個字符串。切割。獲取規則以外的子串。

           4、想要拿到符合需求的字符串子串,獲取。獲取符合規則的子串。

        如:

               //1、需求:對郵件地址進行校驗。

           public static void checkMail(){

                       String mail="[email protected]";

                      mail= "[email protected]";

                      Stringreg ="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";   //較爲精確的匹配。

                      reg="\\w+@\\w+(\\.\\w+)+";//相對不太精確的匹配。

               System.out.println(mail.matches(reg));

               }

            //2、網頁爬蟲(蜘蛛)

                importjava.io.*;

                importjava.util.regex.*;

                importjava.net.*;

                importjava.util.*;

                classRegexTest{

                       public static voidmain(String[] args)throws Exception{

                               getMails();

                      }

                      publicstatic void getMails()throwsException{

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

                      URLConnection conn=url.openConnection();

                       BufferedReaderbufIn = newBufferedReader(new InputStreamReader(conn.getInputStream()));

                               String line = null;

                       Stringmailreg ="\\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());

                                         }

                              }

                      }

                }

 

---------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ----------------------

 


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