1. 程式人生 > >Java正則表示式學習與記錄

Java正則表示式學習與記錄

轉載自:http://www.runoob.com/java/java-regular-expressions.html

正則表示式定義了字串的模式,用於搜尋、編輯或處理文字。

1、正則表示式中字元意義:

\            將下一字元標記為特殊字元。

^           匹配輸入字串開始的位置。

$           匹配輸入字串結束的位置。

*           零次或多次匹配前面的字元或子表示式。

+           一次或多次匹配前面的字元或子表示式。

?           零次或一次匹配前面的字元或子表示式。當此字元緊隨任何其他限定符(*、+、?、{n}、{n,}、{n,m})之後時,匹配模式是"非貪心的"。

             "非貪心的"模式匹配搜尋到的、儘可能短的字串,而預設的"貪心的"模式匹配搜尋到的、儘可能長的字串。例如,

             在字串"oooo"中,"o+?"只匹配單個"o",而"o+"匹配所有"o"。

{n}         正好匹配 n 次。

{n,}        至少匹配 次。

{n,m}     匹配至少 n 次,至多 m 次。

x|y         匹配 x 或 y。

[xyz]      匹配包含的任一字元。

[^xyz]    匹配未包含的任何字元。

[a-z]      匹配指定範圍內的任何字元。

[^a-z]    匹配不在指定的範圍內的任何字元。

\b          匹配一個字邊界,即字與空格間的位置。例如,"er\b"匹配"never"中的"er",但不匹配"verb"中的"er"。

\B          非字邊界匹配,"er\B"匹配"verb"中的"er",但不匹配"never"中的"er"。

\d          數字字元匹配,等效於 [0-9]。

\D         非數字字元匹配,等效於 [^0-9]。

\f           換頁符匹配,等效於 \x0c 和 \cL。

\n          換行符匹配,等效於 \x0a 和 \cJ。

\r          匹配一個回車符,等效於 \x0d 和 \cM。

\s         匹配任何空白字元,包括空格、製表符、換頁符等,與 [ \f\n\r\t\v] 等效。

\t          製表符匹配,與 \x09 和 \cI 等效。

\v         垂直製表符匹配,與 \x0b 和 \cK 等效。

\w        匹配任何字類字元,包括下劃線,與"[A-Za-z0-9_]"等效。

\W       與任何非單詞字元匹配,與"[^A-Za-z0-9_]"等效。

2、Java中正則表示式主要使用的類為:

  • Pattern 類:

    pattern 物件是一個正則表示式的編譯表示。Pattern 類沒有公共構造方法。要建立一個 Pattern 物件,你必須首先呼叫其公共靜態編譯方法,它返回一個 Pattern 物件。該方法接受一個正則表示式作為它的第一個引數。

  • Matcher 類:

    Matcher 物件是對輸入字串進行解釋和匹配操作的引擎。與Pattern 類一樣,Matcher 也沒有公共構造方法。你需要呼叫 Pattern 物件的 matcher 方法來獲得一個 Matcher 物件。

用法為:

public boolean matches()      嘗試將輸入字串與模式整體匹配,成功返回true,失敗返回false。如果部分匹配成功,將移動到下次匹配的位置

public boolean lookingAt()    嘗試將輸入字串開頭開始的輸入序列與該模式匹配,如果成功,則返回true,並且移動到下次匹配的位置,相當於第一次執行find()方法,start()方法和end()方法也被賦值了。

public boolean find()              嘗試查詢與該模式匹配的輸入序列的下一個子序列,如果成功,則返回true,並且移動到下次匹配的位置。

注意事項:  matches()方法和lookingAt()方法相互影響匹配結果,並且都會影響find()的匹配結果,而find()方法不會影響matches()和lookingAt()結果。

例項:

String str = "acbcacdbc";
        String regex = "a.{1,2}b";
        
        Pattern pattern = Pattern.compile(regex);
        Matcher m = pattern.matcher(str);
        System.out.println("先執行matches()方法,再執行find()方法");
        System.out.println(m.matches());
        while (m.find()) {
            System.out.println(str.substring(m.start(), m.end()));
        }
        
        m.reset();
        System.out.println("先執行find()方法,再執行matches()方法");
        while (m.find()) {
            System.out.println(str.substring(m.start(), m.end()));
        }
        System.out.println(m.matches());
        
        m.reset();
        System.out.println("先執行lookingAt()方法,再執行find()方法");
        System.out.println(m.lookingAt());
        while (m.find()) {
            System.out.println(str.substring(m.start(), m.end()));
        }
        
        m.reset();
        System.out.println("先執行find()方法,再執行lookingAt()方法");
        while (m.find()) {
            System.out.println(str.substring(m.start(), m.end()));
        }
        System.out.println(m.lookingAt());

輸出結果:

先執行matches()方法,再執行find()方法
false
acdb
先執行find()方法,再執行matches()方法
acb
acdb
false
先執行lookingAt()方法,再執行find()方法
true
acdb
先執行find()方法,再執行lookingAt()方法
acb
acdb
true