中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Java正則表達式API詳解

2018-07-20    來源:編程學習網(wǎng)

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

Java中正則表達式相關(guān)的類都在java.util.regex之內(nèi),一般來說,主要用到的是這兩個類:java.util.regex.Patternjava.util.regex.Matcher。Pattern對應(yīng)正則表達式,一個Pattern與一個String對象關(guān)聯(lián),生成一個Matcher,它對應(yīng)Pattern在String中的一次匹配; 調(diào)用Matcher對象的find()方法,Matcher對象就會更新為下一次匹配的匹配信息。示例:

Pattern pattern = Pattern.compile("\\d{4}-\\d{2}-]]d{2}");
String string = "2010-12-20 2011-02-14";
Matcher matcher = pattern.matcher(string);
while(matcher.find()) {
    System.out.println(matcher.group(0));
}

Pattern

Pattern是Java語言中的正則表達式對象。要使用正則表達式,首先必須從字符串“編譯”出Pattern對象,這需要用到Pattern.compile(String regex)方法。

Pattern pattern = Pattern.compile("a.b+");

如果要指定匹配模式,可以在表達式中使用(?modifier)修飾符指定,也可以使用預(yù)定義常量。下面的兩個Pattern對象的生成方法不同,結(jié)果卻是等價的。

Pattern pattern = Pattern.compile("(?i)a.b+");
Pattern pattern = Pattern.compile("a.b+",Pattern.CASE_INSENSITIVE);

如果要同時指定多種模式,可以連寫模式修飾符,也可以直接用|運算符將預(yù)定義常量連接起來,以下兩個Pattern對象也是等價的。

Pattern pattern = Pattern.compile("(?is)a.b+");
Pattern pattern = Pattern.compile("a.b+",Pattern.CASE_INSENSITIVE | Pattern.DOTALL);

下面介紹Pattern的主要成員方法:

1. static boolean matches(String regex.CharSequence input)

這個方法可以檢驗字符串input能否由正則表達式regex匹配,因為是靜態(tài)方法,所以不需要編譯生成各個對象,方便隨手使用。要注意的是,它檢驗的是“整個字符串能否由表達式匹配”,而不是“表達式能否在字符串中找到匹配”。你可以認為regex的首尾自動加上了匹配字符串起始和結(jié)束位置的錨點 \A和\z 。

Pattern.matches("\\d{6}","a123456");   //false
Pattern.matches("\\d{6}","123456");     //true

2. String[] split(CharSequence text)

通常,Pattern對象需要配合下面將要介紹的Matcher一起完成正則操作。如果只用正則表達式來切分字符串,只用Pattern的這個方法也可以。

這個方法接收的參數(shù)類型是CharSequence它可能有點陌生,其實它是String的父類,其他子類還有CharBuffer,StringBuffer,StringBuilder,因而可以應(yīng)對常見的各種表示“字符串”的類。下面的代碼僅以String為例:

String s = "2010-12-20";
Pattern pattern = Pattern.compile("\\s+");
for(String part : pattern.split(s)){
    System.out.println(part);
}

3. String[] split(CharSequence text,int limit)

這個方法與上面的方法很相似,只是多了一個參數(shù)limit,它用來限定返回的String數(shù)組的最大長度。也就是說,它規(guī)定了字符串至多只能“切”limit-1次。如果不需要對字符串比較大,進行盡可能多的切分,使用這個方法。

String s = " 2010-12-20  ";
Pattern pattern = Pattern.compile("\\s+");
for(String part : Pattern.split(s,2)){
    System.out.println(part);
}

既然limit是一個int類型,那么它自然可以設(shè)定為各種值,下表總結(jié)了limit在各個取值區(qū)間對結(jié)果的影響(未指定limit時,最終返回包含n個元素的數(shù)組,實際能切分的次數(shù)是 n-1 ):

取值                      
結(jié)果                                                                                    
limit < 0
等于未設(shè)定limit時,保留末尾的空字符串
limit = 0 
等于未設(shè)定limit時,切分n-1次,忽略末尾的空字符串
0 < limit < n
返回數(shù)組包含limit個元素,切分limit-1次,最后一個元素是第limit-1次切分后,右側(cè)剩下的所有文本
limit >= n
等于未指定limit時

4. static String quote(String text)

這個方法用來取消字符串text中所有轉(zhuǎn)義字符的特殊含義,實質(zhì)就是在字符串首尾添加 \Q 和 \E。通常,如果需要把某個字符串作為沒有任何特殊意義的正則表達式(比如從外界讀入的字符串,用在某個復(fù)雜的正則表達式中),就可以使用這個方法:

"aacb".matches("a*.b");            //true
"a*.b".matches("a*.b");             //false
"a*.b".matches("a*.b");             //false
"a*.b".matches(Pattern.quote("a*.b"));        //true

Matcher

Matcher可以理解為“某次具體匹配的結(jié)果對象”:把編譯好的Pattern對象“應(yīng)用”到某個String對象上,就獲得了作為“本次匹配結(jié)果”的Matcher對象。之后,就可以通過它獲得關(guān)于匹配的信息。

Pattern pattern = Pattern.compile("\\d{4}-\\d{2}-\\d{2}");
Matcher matcher = pattern.matcher("2010-12-20 2011-02-14");
while(matcher.find()){
    System.out.println(matcher.group());
}

對編譯好的Pattern對象調(diào)用matcher(String text)方法,傳入要匹配的字符串text,就得到了Matcher對象,每次調(diào)用一次find()方法,如果返回true,就表示“找到一個匹配”,此時可以通過下面的若干方法獲得關(guān)于本次匹配的信息。

1. String group(int n)

返回當前匹配中第n對捕獲括號捕獲的文本,如果n為0,則取匹配的全部內(nèi)容;如果n小于0或者大于最大分組編號數(shù),則報錯。

2. String group()

返回當前匹配的全部文本,相當于group(0)。

3. int groupCount()

返回此Matcher對應(yīng)Pattern對象中包含的捕獲分組數(shù)目,編號為0的默認分組不計在內(nèi)。

4. int start(n)

返回當前匹配中第n對捕獲括號匹配的文本在原字符串中的起始位置。

5. int start()

返回當前匹配的文本在原字符串中的起始位置,相當于start(0)。

6. int end(n)

返回當前匹配中第n對捕獲括號匹配的文本在原字符串中的結(jié)束位置。

7. int end()

返回當前匹配的文本在原字符串中的結(jié)果位置,相當于end(0)。

8. String replaceAll(String replacement)

如果進行正則表達式替換,一般用到的是Matcher的replaceAll()方法,它會將原有文本中正則表達式能匹配的所有文本替換為replaceement字符串。

String

許多時候只需要臨時使用某個正則表達式,而不需要重復(fù)使用,這時候每次都生成Pattern對象和Matcher對象再操作顯得很煩瑣。所以,Java的String類提供了正則表達式操作的靜態(tài)成員方法,只需要String對象就可以執(zhí)行正則表達式操作。

1. boolean matches(String regex)

這個方法判斷當前的string對象能否由正則表達式regex匹配。請注意,這里的“匹配”指的并不是regex能否在String內(nèi)找到匹配,而是指regex匹配整個String對象,因此非常適合用來做數(shù)據(jù)校驗。

"123456".matches("\\d{6}");            //true
"a123456".matches("\\d{6}");          //true

2. String replaceFirst(String regex,String replacement)

這個方法用來替換正則表達式regex在字符串中第一次能匹配的文本,可以在replacement字符串中用$num引用regex中對應(yīng)捕獲分組匹配的文本。

"2010-12-20 2011-02-14".replaceFirst("(\\d{4})-(\\d{2})-(\\d{2})","$2/$3/$1");

3. String replaceAll(String regex,String replacement)

這個方法用來進行所有的替換,它的結(jié)果等同于Matcher類的replaceAll()方法,replacement字符串中也可以用$num的表示法引用regex中對應(yīng)捕獲分組匹配的文本。

"2010-12-20 2011-02-14".replaceAll("(\\d{4})-(\\d{2})-(\\d{2})","$2/$3/$1");

4. String[] split(String regex)

這個方法等價于Pattern中對應(yīng)的split()方法,此處不再贅述。

5. String[] split(String regex,int limit)

這個方法等價于Pattern中對應(yīng)的split()方法,此處不再贅述。

來自:http://my.oschina.net/fhd/blog/370833

標簽: 代碼

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:面向?qū)ο笤O(shè)計的 10 條戒律

下一篇:構(gòu)建 Android 應(yīng)用程序一定要繞過的 30 個坑