国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Java正則表達(dá)式(一) - fuliang - JavaEye技術(shù)網(wǎng)站

Java正則表達(dá)式(一)

關(guān)鍵字: java regex,regular expression
正則表達(dá)式在處理文本方面用處非常大,最早像在Perl和awk語言中,提供了這種機(jī)制,Java在Java 2中也增加了正則表達(dá)式這個(gè)包java.util.regex。這個(gè)包為用戶使用正則表達(dá)式,提供了易用而全面的支持。我的研究方向是web挖掘。從網(wǎng)頁中提取內(nèi)容,處理文本,當(dāng)然需要正則表達(dá)式這個(gè)強(qiáng)大的工具了。
一、首先我們看一下怎么使用正則表達(dá)式的一個(gè)例子:
A Matcher examines the results of applying a pattern.
我們希望從這句話中找到所有開頭為a的單詞。
當(dāng)然這只是一個(gè)簡單的例子,你可以使用String提供的split方法,得到單詞數(shù)組,然后
遍歷各個(gè)單詞看是否是否開頭為a
我們現(xiàn)在看看怎么使用正則表達(dá)式來處理這個(gè)問題:
Java代碼
  1. import java.util.regex.*;  

  2. public class FindA{  

  3.   public static void main(String args[])  

  4.   throws Exception{  

  5.     String candidate =  

  6.      "A Matcher examines the results of applying a pattern.";  

  7.     String regex = "\\ba\\w*\\b";  

  8.     Pattern p = Pattern.compile(regex);  

  9.     Matcher m = p.matcher(candidate);  

  10.     String val = null;  

  11.     System.out.println("INPUT: " + candidate);  

  12.     System.out.println("REGEX: " + regex +"\r\n");  

  13.     while (m.find()){  

  14.       val = m.group();  

  15.       System.out.println("MATCH: " + val);  

  16.     }  

  17.     if (val == null) {  

  18.       System.out.println("NO MATCHES: ");  

  19.     }  

  20.   }  

  21. }  


從這個(gè)例子我們可以看到正則表達(dá)式涉及到的兩個(gè)類Matcher和Pattern,我們以后會(huì)專門討論著連個(gè)類。現(xiàn)在主要看看使用正則表達(dá)式的流程:
首先使用 Pattern的一個(gè)靜態(tài)的方法compile來創(chuàng)建Pattern對(duì)象,
Java代碼
  1. Pattern p = Pattern.compile(regex);  


然后調(diào)用Pattern的方法matcher
Java代碼
  1. Matcher m = p.matcher(candidate);  


得到了Matcher對(duì)象,Matcher對(duì)象保存了許多匹配信息,然后可以通過find()方法
查找匹配的部分,如果有匹配的部分,返回真,使用m.group方法得到匹配的各組值,
否則find返回false.
當(dāng)然這只是一般的過程,還有許多更細(xì)的方法,在以后會(huì)陸續(xù)的總結(jié),下面我們看一下
Java代碼
  1. String regex = "\\ba\\w*\\b";  


這個(gè)就是一個(gè)正則表達(dá)式,b,w,*都是正則表達(dá)式的meta character原字符,
\b表示單詞的邊界,w表示任意的可構(gòu)成單詞的字母數(shù)字,*表示前面的字母(當(dāng)然可以
是更復(fù)雜的組之類的了東東)重復(fù)0次或0次以上,a當(dāng)然還是a了。所以這個(gè)regex就
匹配單詞開頭為a的單詞了。
二、下面總結(jié)一下基本的正則表達(dá)式的meta character以及它們含義:
.  匹配任意一個(gè)字符 $ 匹配一行的結(jié)尾 ^ 匹配一行的開頭(在[]里面表示否定)
{} 定義了一個(gè)范圍  [] 定義了一個(gè)字符類 () 定義了一個(gè)組
*前面出現(xiàn)0次以上   + 前面匹配一次以上 ?前面出現(xiàn)0次或一次
\ 后面的字符不會(huì)看作metacharacter  \w 字母數(shù)字下劃線 \W 非字母數(shù)字下劃線
\d 單個(gè)數(shù)字 \D單個(gè)非數(shù)字 | 或,二者之一 &&與操作符 \b單詞邊界
下面看看幾個(gè)簡單的例子:
[abc] a、b 或 c(簡單類)
[^abc] 任何字符,除了a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,兩頭的字母包括在內(nèi)(范圍)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](減去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](減去)
三、java.util.regex提供的操作接口:
java.util.regex包提供了操作正則表達(dá)式的模型,整個(gè)模型優(yōu)雅而簡潔,只有三個(gè)類:Pattern、Matcher和
PatternSyntaxException。下面將要總結(jié)他們提供的方法,以及如何靈活應(yīng)用來處理文本。

我們還是從Pattern的靜態(tài)工廠方法來擴(kuò)展吧:
Java代碼
  1. static Pattern compile(String regex)   


將給定的正則表達(dá)式編譯到模式中,并創(chuàng)建Pattern對(duì)象,這個(gè)方法通常是操作正則表達(dá)式的第一步,從前面那個(gè)例子
我們也可以看到整個(gè)的流程。
在看看一個(gè)重載的compile方法:
Java代碼
  1. static Pattern compile(String regex, int flags)   


將給定的正則表達(dá)式編譯到具有給定標(biāo)志的模式中。 這個(gè)方法參數(shù)flags提供了一些特殊的選項(xiàng)來用于特殊的處理,
我們下面看看可使用的選項(xiàng):
UNIX_LINES:這個(gè)主要處理UNIX和其他的操作系統(tǒng)在行結(jié)束符不一樣的問題,UNIX使用\n代表一行的終止,而Windows
則使用了\r\n,\n,\r,\u2028或者\(yùn)u0085作為一行的結(jié)束符。
CASE_INSENSITIVE:當(dāng)我們?cè)谄ヅ涞臅r(shí)候要忽略字符大小寫時(shí)
COMMENTS:允許我們?cè)谡齽t表達(dá)式中使用注釋,例如
Java代碼
  1. Pattern p =Pattern.compile("A    #matches uppercase US-ASCII char code 65",Pattern.COMMENTS);  


MULTILINE:表明要輸入多行,他們有自己的終止字符。
Java代碼
  1. Pattern p = Pattern.compile("^", Pattern.MULTILINE);  


如果你的輸入的字符串是:This is a sentence.\n So is this..
這樣我們匹配的字符時(shí)This中的T和So中的S,如果不使用MULTILINE,則只會(huì)匹配T
DOTALL:使用這個(gè)選項(xiàng)之后metacharacter .就可以包括一行的終止字符了,如果沒有這個(gè)選項(xiàng),
一行的終止字符,并不會(huì)考慮在字符串之內(nèi)的。
使用這個(gè)選項(xiàng)會(huì)降低效率
Java代碼
  1. Pattern p = Pattern.compile(".", Pattern.DOTALL);  


如果我們輸入的是Test\n,則匹配的字符是5個(gè)。
UNICODE_CASE:處理UNICODE字符集,使用這個(gè)選項(xiàng)會(huì)降低效率
CANON_EQ:一個(gè)字符的實(shí)際存儲(chǔ)形式是經(jīng)過編碼后的數(shù)字,使用CANON_EQ選項(xiàng)就可以匹配一個(gè)字母在各種編碼了。
例如a可以匹配+00E0和U+0061U+0300
使用這個(gè)選項(xiàng)會(huì)降低效率
我們可以組合以上選項(xiàng),只要使用|,進(jìn)行按位或操作即可
Java代碼
  1. Pattern p =  

  2. Pattern.compile("t # a compound flag example",Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE|  

  3. Pattern.COMMENT);  


我們還要注意點(diǎn)的時(shí)Java對(duì)轉(zhuǎn)譯字符\的處理,例如我們要匹配一個(gè)數(shù)字:
我們不能使用:
Java代碼
  1. Pattern p = Pattern.compile("\d");  


而是:
Java代碼
  1. Pattern p = Pattern.compile("\\d");  


另外如果regex本身形式是錯(cuò)誤的,compile方法會(huì)拋出java.util.regex.PatternSyntaxException異常。
下面我們總結(jié)一下public Matcher matcher(CharSequence input)方法:
當(dāng)我們使用compile操作,創(chuàng)建了Pattern對(duì)象之后,我們就可以使用Pattern對(duì)象的matcher操作,生成
matcher對(duì)象了,Matcher對(duì)象包含了許多對(duì)匹配結(jié)果集的操作,我們?cè)诳偨Y(jié)Matcher對(duì)象的時(shí)候再說。另外
順便提一下參數(shù)CharSequence,CharBuffer, Segment, String, StringBuffer,StringBuilder 都實(shí)現(xiàn)了
這個(gè)接口,所以參數(shù)可以是這些中的任一種類型了。
下面我們看看:
Java代碼
  1. public int flags()  


這個(gè)方法返回了我們前面可以設(shè)置的并且已經(jīng)設(shè)置的flags選項(xiàng),我們通過按位與來判斷是否設(shè)置了某個(gè)選項(xiàng):
Java代碼
  1. int flgs = myPattern.flags();  

  2. boolean isUsingCommentFlag =( Pattern.COMMENTS == (Pattern.COMMENTS & flgs)) ;  


看看一個(gè)簡化過程的方法:
Java代碼
  1. public static boolean matches (String regex,CharSequence input)  


這個(gè)方法實(shí)際上是:
Java代碼
  1. Pattern p = Pattern.compile(regex);  

  2. Matcher m = p.matcher(candidate);  

  3. m.matches()  


過程的一個(gè)簡化,我們?cè)诤竺婵偨Y(jié)Matcher中的matches方法之后就會(huì)理解這個(gè)了。
想必我們經(jīng)常使用把字符串提取出token變成字符串?dāng)?shù)組的String中的split方法吧,下面我們看看
類似的一個(gè)方法:
public String[] split(CharSequence input)
這個(gè)方法提供了強(qiáng)大的功能,因?yàn)樗梢允褂谜齽t表達(dá)式來作為token的分割:
Java代碼
  1. Pattern p = new Pattern.compile(",|and");  

  2. String fruits[] = p.split("apple,banana and orange");  


split的一個(gè)重載的版本:
Java代碼
  1. public String[] split(CharSequence input, int limit)  


它指定了劃分的組數(shù),有以下三種情況:
limit==0
這時(shí)候和沒有l(wèi)imit參數(shù)的那個(gè)split效果一樣
limit>0
如果你僅僅對(duì)前l(fā)imit個(gè)感興趣,你可以使用limit:
Java代碼
  1. String[] tmp = pattern.split("Hello, Dolly, You, Are, My, Favorite",3);  

  2. //tmp[0] is  "Hello",  

  3. // tmp[1] is "Dolly";  

  4. //tmp[2] is  "You, Are, My, Favorite";  


limit<0
會(huì)盡可能的劃分所有的組,即使分割符后面是個(gè)空字符,也要單獨(dú)生成一個(gè)token:""
Java代碼
  1. Pattern p = Pattern.compile(",");  

  2. String temp[] = p.split("Hello,Dolly,", -1);  

  3. //temp[]={"Hello","Dolly",""}  


下次再總結(jié)Matcher類,和正則表達(dá)式的一些高級(jí)部分
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java正則表達(dá)式典型用例
Java中正則表達(dá)式的使用
JAVA與正則表達(dá)式
JAVA正則表達(dá)式
java正則表達(dá)式及api
JAVA正則表達(dá)式實(shí)例教程AAA
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服