正則表達式定義了字符串的模式,他能夠用來搜索、編輯或處理文本。並不只限於某一種語言,可是在每種語言中有細微的差異。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. */ }
次數匹配操做符後面沒跟
?
的話,則都爲貪婪匹配。