正則表達式從入門到精通(提高篇)

我們來一起看一下正則表達式的一些高級的用法。

1.正則表達式之子模式

爲了弄清子模式的用法,我們先來看一個正則表達式。”((ab)+)dfs”。在這個正則表達式中,我們可以將表達式分爲兩部分,第一部分是”((ab+))”,第二部分是”dfs”。假如現在有一個字符串”ababdfs”,那麼正則表達式的第一部分匹配到了”abab”。加入我想取出來這個第一部分的匹配結果,那麼我就可以使用”$1”來引用”abab”。也就是說我們的到的匹配結果其實是一個數組。在正則表達式中,左括號的計數,就是子模式的下標。
關於子模式通常有兩種用法。

  1. 在正則表達式本身中使用子模式\n,n代表子模式的下標。
    比如我們要匹配”aabb”這樣的串,那麼我們可以這樣寫正則”(.)\1(.)\2”。(.)匹配到a,\1表示第一個子模式,即(.),因此也匹配a.後面的同理。
  2. 在正則表達式外面使用子模式$n,n代表子模式的下標。
    下面我們用例子來說明。
    比如有這樣一個字符串”aabccddeeeeeffff”,我要去掉重複的字符,將結果變成”abcdef”,那麼我們可以這麼做。
        String reg="(.)(\\1)+";//正則表達式,第一個\是爲了轉義
        String ret = "aabccddeeeeeffff".replaceAll(reg, "$1");//將匹配到的重複字符變成單個字符
        System.out.println(ret);

輸出結果爲:abcdef。

2.正則表達式之非捕獲組

非捕獲組的意思是不需要在結果中捕獲。還是舉個例子來說明。正則表達式”(a+)(b+)”正常情況下”$1”代表”a+”即第一個子模式,”$2”代表”b+”即第二個子模式。但是現在我不需要引用第一個子模式,我值關心第二個子模式。我就可以再第一個子模式的前面加上”?:”來排除第一個子模式。這個時候我再使用”$1”的時候,引用的就是”b+”這個子模式了。

String reg="(?:http|ftp|svn)://([^/]+)([/].+)";//正則表達式,匹配任意網址,(?:http|ftp|svn)                                                                      將第一個子模式作爲非捕獲組
        String webSite = "http://www.baidu.com/zhang".replaceAll(reg, "$1");//將任意網址替換爲它本身的一級主域名
        System.out.println(webSite);

輸出結果爲:www.baidu.com

3.正則表達式之環視

環視是指在做匹配時不只着眼當前,還要環視這個表達串,來進行匹配。依然舉個例子。
正則表達式”(b+?<=aaa)”代表匹配多個b(可能是一個或者多個),?<在這裏就表示環視的意思,代表多個b後面必須跟着3個a。環視一般有四個用法,分別是:
(?<=expr)匹配前面是expr的字符串。
(?<!expr)匹配前面不是expr的字符串。
(?=expr)匹配後面是expr的字符串。
(?!expr)匹配後面不是expr的字符串。
環視有兩個特性:

              - 環視部分不佔寬度  
              - 環視部分可以重複匹配

看上去似乎很難理解,我們依然舉個例子來說明。
先說第一點。
下面的例子輸出結果爲ab。也就是說環視只是一個是否匹配的附加條件,並不會作爲匹配結果的一部分。

        String reg="ab(?=def)";
        Pattern p=Pattern.compile(reg);
        Matcher matcher = p.matcher("abdef");
        //Matcher matcher = p.matcher("");
        while(matcher.find()){
            System.out.println(matcher.group());
        }

再說第二點。
下面例子中的正則表達式表示一個7-15位的字符串,不能全部是數字,不能全部是字母(包括全部大寫,全部小寫,全部大小寫混合),不能全部是小寫字母和數字。

        String reg=
        "(?!^[0-9]+$)(?!^[A-Z]+$)(?!^[a-z]$)(?!^[a-z0-9]+$)(?!^[A-Za-z]+$)(^[a-zA-Z0-9]{7,15}$)";
        Pattern p=Pattern.compile(reg);
        Matcher matcher = p.matcher("a6BdeDFSAFASf");
        //Matcher matcher = p.matcher("");
        while(matcher.find()){
            System.out.println(matcher.group());
        }

這個例子中的正則其實加入了很多環視,(?!^[0-9]+$)是第一個環視,排除掉了全部是數字的情況,(?!^[A-Z]+$)排除掉了全部是大寫字母的情況。(?!^[a-z]$)排除掉了全部是小寫字母的情況,(?!^[a-z0-9]+$)排除掉了小寫字母和數字混合的情況,(?!^[A-Za-z]+$)排除掉了大小寫字母混合的情況。(^[a-zA-Z0-9]{7,15}$)是我們需要的通用正則表達式,在符合上述環視條件的情況下,我們拿到的就是我們需要的字符串。從這個例子中可以看出來,環視是可以重複匹配的,第一個環視從頭匹配到結尾,第二個環視還可以從頭匹配到結尾,後面的每一個環視都是如此。
最後,想說一點,正則表達式是實際變成中應用廣泛,勤加練習,我們每一個人都能很好的掌握它。

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