【正則表達式】1.入門

簡介

正則表達式定義了字符串的模式,他能夠用來搜索、編輯或處理文本。並不只限於某一種語言,可是在每種語言中有細微的差異。java

一、正則表達式實例

一個字符串其實就是一個簡單的正則表達式,例如 Hello World 正則表達式匹配 "Hello World" 字符串。正則表達式

.(點號)也是一個正則表達式,它匹配任何一個字符如:"a""1"this

下表列出了一些正則表達式的實例及描述:code

正則表達式 描述 可匹配實例
this is text 匹配字符串 "this is text"
this\s+is\s+text 注意字符串中的 \s+。匹配單詞 "this" 後面的 \s+ 能夠匹配多個空格,以後匹配 is 字符串,再以後 \s+ 匹配多個空格而後再跟上 text 字符串。 this is text
^\d+(.\d+)? ^ 定義了以什麼開始,\d+ 匹配一個或多個數字;? 設置括號內的選項是可選的;\. 匹配 . "5", "1.5""2.21"

Java 正則表達式和 Perl 的是最爲類似的。對象

java.util.regex 包主要包括如下三個類:字符串

  • Pattern 類 pattern 對象是一個正則表達式的編譯表示。Pattern 類沒有公共構造方法。要建立一個 Pattern 對象,你必須首先調用其公共靜態編譯方法,它返回一個 Pattern 對象。該方法接受一個正則表達式做爲它的第一個參數。it

  • Matcher 類 Matcher 對象是對輸入字符串進行解釋和匹配操做的引擎。與Pattern 類同樣,Matcher 也沒有公共構造方法。你須要調用 Pattern 對象的 matcher 方法來得到一個 Matcher 對象。io

  • PatternSyntaxException PatternSyntaxException 是一個非強制異常類,它表示一個正則表達式模式中的語法錯誤。編譯

如下實例中使用了正則表達式 .*China.* 用於查找字符串中是否包了 China 子串table

@Test
    public void  test01(){
        String text = "China is a county with a long history.";
        String regex = ".*China.*";
        boolean matches = Pattern.matches(regex, text);
        System.out.println("是否包含China:" + matches);
        // 是否包含China:true
    }

二、捕獲組

捕獲組是把多個字符當一個單獨單元進行處理的方法,它經過對括號內的字符分組來建立。

例如,正則表達式 (dog) 建立了單一分組,組裏包含"d","o",和"g"。

捕獲組是經過從左至右計算其開括號來編號。例如,在表達式((A)(B(C),有四個這樣的組:

((A)(B(C)))
(A)
(B(C))
(C)

能夠經過調用 matcher 對象的 groupCount 方法來查看錶達式有多少個分組。groupCount 方法返回一個 int 值,表示matcher對象當前有多個捕獲組。

還有一個特殊的組(group(0)),它老是表明整個表達式。該組不包括在 groupCount 的返回值中。也就是說,沒有使用()的表達式,匹配出的結果,即使獲得了全匹配,他的groupCount也爲0

@Test
    public void test02(){
        String text = "Onmyoji is a round game of public test in 2016 summer.";
        String regex = "(\\D*)(\\d+)(.*)";

        Pattern pattern = Pattern.compile(regex);

        Matcher matcher = pattern.matcher(text);

        if(matcher.find()){
            int count = matcher.groupCount();
            for (int i = 0; i <= count ; i++) {
                System.out.println("group " + i + ":" + matcher.group(i));
            }
        }else{
            System.out.println("Not matched.");
        }
        /**
         * group 0:Onmyoji is a round game of public test in 2016.
         * group 1:Onmyoji is a round game of public test in
         * group 2:2016
         * group 3:summer.
         */
    }

次數匹配操做符後面沒跟?的話,則都爲貪婪匹配。

相關文章
相關標籤/搜索