欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
如何使用Java自帶的正則表達式
在Sun的Java JDK 1.40版本中,Java自帶了支持正則表達式的包,本文就拋磚引玉地介紹了如何使用java.util.regex包。

可粗略估計一下,除了偶爾用Linux的外,其他Linu x用戶(hù)都會(huì )遇到正則表達式。正則表達式是個(gè)極端強大工具,而且在字符串模式-匹配和字符串模式-替換方面富有彈性。在Unix世界里,正則表達式幾乎沒(méi)有什么限制,可肯定的是,它應用非常之廣泛。

正則表達式的引擎已被許多普通的Unix工具所實(shí)現,包括grep,awk,vi和Emacs等。此外,許多使用比較廣泛的腳本語(yǔ)言也支持正則表達式,比如Python,Tcl,JavaScript,以及最著(zhù)名的Perl。

我很早以前就是個(gè)Perl方面的黑客,如果你和我一樣話(huà),你也會(huì )非常依賴(lài)你手邊的這些強大的text-munging工具。近幾年來(lái),像其他程序開(kāi)發(fā)者一樣,我也越來(lái)越關(guān)注Java的開(kāi)發(fā)。

Java作為一種開(kāi)發(fā)語(yǔ)言,有許多值得推薦的地方,但是它一直以來(lái)沒(méi)有自帶對正則表達式的支持。直到最近,借助于第三方的類(lèi)庫,Java開(kāi)始支持正則表達式,但這些第三方的類(lèi)庫都不一致、兼容性差,而且維護代碼起來(lái)很糟糕。這個(gè)缺點(diǎn),對我選擇Java作為首要的開(kāi)發(fā)工具來(lái)說(shuō),一直是個(gè)巨大的顧慮之處。

你可以想象,當我知道Sun的Java JDK 1.40版本包含了java.util.regex(一個(gè)完全開(kāi)放、自帶的正則表達式包)時(shí),是多么的高興!很搞笑的說(shuō),我花好些時(shí)間去挖掘這個(gè)被隱藏起來(lái)的寶石。我非常驚奇的是,Java這樣的一個(gè)很大改進(jìn)(自帶了java.util.regex包)為什么不多公開(kāi)一點(diǎn)呢?!

最近,Java雙腳都跳進(jìn)了正則表達式的世界。java.util.regex包在支持正則表達也有它的過(guò)人之處,另外Java也提供詳細的相關(guān)說(shuō)明文檔。使得朦朦朧朧的regex神秘景象也慢慢被撥開(kāi)。有一些正則表達式的構成(可能最顯著(zhù)的是,在于糅合了字符類(lèi)庫)在Perl都找不到。

在regex包中,包括了兩個(gè)類(lèi),Pattern(模式類(lèi))和Matcher(匹配器類(lèi))。Pattern類(lèi)是用來(lái)表達和陳述所要搜索模式的對象,Matcher類(lèi)是真正影響搜索的對象。另加一個(gè)新的例外類(lèi),PatternSyntaxException,當遇到不合法的搜索模式時(shí),會(huì )拋出例外。

即使對正則表達式很熟悉,你會(huì )發(fā)現,通過(guò)java使用正則表達式也相當簡(jiǎn)單。要說(shuō)明的一點(diǎn)是,對那些被Perl的單行匹配所寵壞的Perl狂熱愛(ài)好者來(lái)說(shuō),在使用java的regex包進(jìn)行替換操作時(shí),會(huì )比他們所以前常用的方法費事些。

本文的局限之處,它不是一篇正則表達式用法的完全教程。如果讀者要對正則表達進(jìn)一步了解的話(huà),推薦閱讀Jeffrey Frieldl的Mastering Regular Expressions,該書(shū)由O’Reilly出版社出版。我下面就舉一些例子來(lái)教讀者如何使用正則表達式,以及如何更簡(jiǎn)單地去使用它。

設計一個(gè)簡(jiǎn)單的表達式來(lái)匹配任何電話(huà)號碼數字可能是比較復雜的事情,原因在于電話(huà)號碼格式有很多種情況。所有必須選擇一個(gè)比較有效的模式。比如:(212) 555-1212, 212-555-1212和212 555 1212,某些人會(huì )認為它們都是等價(jià)的。

首先讓我們構成一個(gè)正則表達式。為簡(jiǎn)單起見(jiàn),先構成一個(gè)正則表達式來(lái)識別下面格式的電話(huà)號碼數字:(nnn)nnn-nnnn。

第一步,創(chuàng )建一個(gè)pattern對象來(lái)匹配上面的子字符串。一旦程序運行后,如果需要的話(huà),可以讓這個(gè)對象一般化。匹配上面格式的正則表達可以這樣構成:(\d{3})\s\d{3}-\d{4},其中\d單字符類(lèi)型用來(lái)匹配從0到9的任何數字,另外{3}重復符號,是個(gè)簡(jiǎn)便的記號,用來(lái)表示有3個(gè)連續的數字位,也等效于(\d\d\d)。\s也另外一個(gè)比較有用的單字符類(lèi)型,用來(lái)匹配空格,比如Space鍵,tab鍵和換行符。

是不是很簡(jiǎn)單?但是,如果把這個(gè)正則表達式的模式用在java程序中,還要做兩件事。對java的解釋器來(lái)說(shuō),在反斜線(xiàn)字符(\)前的字符有特殊的含義。在java中,與regex有關(guān)的包,并不都能理解和識別反斜線(xiàn)字符(\),盡管可以試試看。但為避免這一點(diǎn),即為了讓反斜線(xiàn)字符(\)在模式對象中被完全地傳遞,應該用雙反斜線(xiàn)字符(\)。此外圓括號在正則表達中兩層含義,如果想讓它解釋為字面上意思(即圓括號),也需要在它前面用雙反斜線(xiàn)字符(\)。也就是像下面的一樣:

\\(\\d{3}\\)\\s\\d{3}-\\d{4}

現在介紹怎樣在java代碼中實(shí)現剛才所講的正則表達式。要記住的事,在用正則表達式的包時(shí),在你所定義的類(lèi)前需要包含該包,也就是這樣的一行:

import java.util.regex.*;

下面的一段代碼實(shí)現的功能是,從一個(gè)文本文件逐行讀入,并逐行搜索電話(huà)號碼數字,一旦找到所匹配的,然后輸出在控制臺。

BufferedReader in;

Pattern pattern = Pattern.compile("\\(\\d{3}\\)\\s\\d{3}-\\d{4}");

in = new BufferedReader(new FileReader("phone"));

String s;

while ((s = in.readLine()) != null)

{

Matcher matcher = pattern.matcher(s);

if (matcher.find())

{

System.out.println(matcher.group());

}

}

in.close();

對那些熟悉用Python或Javascript來(lái)實(shí)現正則表達式的人來(lái)說(shuō),這段代碼很平常。在Python和Javascript這些語(yǔ)言中,或者其他的語(yǔ)言,這些正則表達式一旦明確地編譯過(guò)后,你想用到哪里都可以。與Perl的單步匹配相比,看起來(lái)多多做了些工作,但這并不很費事。

find()方法,就像你所想象的,用來(lái)搜索與正則表達式相匹配的任何目標字符串,group()方法,用來(lái)返回包含了所匹配文本的字符串。應注意的是,上面的代碼,僅用在每行只能含有一個(gè)匹配的電話(huà)號碼數字字符串時(shí)??梢钥隙ǖ恼f(shuō),java的正則表達式包能用在一行含有多個(gè)匹配目標時(shí)的搜索。本文的原意在于舉一些簡(jiǎn)單的例子來(lái)激起讀者進(jìn)一步去學(xué)習java自帶的正則表達式包,所以對此就沒(méi)有進(jìn)行深入的探討。

這相當漂亮吧! 但是很遺憾的是,這僅是個(gè)電話(huà)號碼匹配器。很明顯,還有兩點(diǎn)可以改進(jìn)。如果在電話(huà)號碼的開(kāi)頭,即區位號和本地號碼之間可能會(huì )有空格。我們也可匹配這些情況,則通過(guò)在正則表達式中加入\s?來(lái)實(shí)現,其中?元字符表示在模式可能有0或1個(gè)空格符。

第二點(diǎn)是,在本地號碼位的前三位和后四位數字間有可能是空格符,而不是連字號,更有勝者,或根本就沒(méi)有分隔符,就是7位數字連在一起。對這幾種情況,我們可以用(-|)?來(lái)解決。這個(gè)結構的正則表達式就是轉換器,它能匹配上面所說(shuō)的幾種情況。在()能含有管道符|時(shí),它能匹配是否含有空格符或連字符,而尾部的?元字符表示是否根本沒(méi)有分隔符的情況。

最后,區位號也可能沒(méi)有包含在圓括號內,對此可以簡(jiǎn)單地在圓括號后附上?元字符,但這不是一個(gè)很好的解決方法。因為它也包含了不配對的圓括號,比如"(555" 或 "555)"。相反,我們可以通過(guò)另一種轉換器來(lái)強迫讓電話(huà)號碼是否帶有有圓括號:(\(\d{3}\)|\d{3})。如果我們把上面代碼中的正則表達式用這些改進(jìn)后的來(lái)替換的話(huà),上面的代碼就成了一個(gè)非常有用的電話(huà)號碼數字匹配器:

Pattern pattern =

Pattern.compile("(\\(\\d{3}\\)|\\d{3})\\s?\\d{3}(-|)?\\d{4}");

可以確定的是,你可以自己試著(zhù)進(jìn)一步改進(jìn)上面的代碼。

現在看看第二個(gè)例子,它是從Friedl的中改編過(guò)來(lái)的。其功能是用來(lái)檢查文本文件中是否有重復的單詞,這在印刷排版中會(huì )經(jīng)常遇到,同樣也是個(gè)語(yǔ)法檢查器的問(wèn)題。

匹配單詞,像其他的一樣,也可以通過(guò)好幾種的正則表達式來(lái)完成??赡茏钪苯拥氖荺b\w+\b,其優(yōu)點(diǎn)在于只需用少量的regex元字符。其中\w元字符用來(lái)匹配從字母a到u的任何字符。+元字符表示匹配匹配一次或多次字符,\b元字符是用來(lái)說(shuō)明匹配單詞的邊界,它可以是空格或任何一種不同的標點(diǎn)符號(包括逗號,句號等)。

現在,我們怎樣來(lái)檢查一個(gè)給定的單詞是否被重復了三次?為完成這個(gè)任務(wù),需充分利用正則表達式中的所熟知的向后掃描。如前面提到的,圓括號在正則表達式中有幾種不同的用法,一個(gè)就是能提供組合類(lèi)型,組合類(lèi)型用來(lái)保存所匹配的結果或部分匹配的結果(以便后面能用到),即使遇到有相同的模式。在同樣的正則表達中,可能(也通常期望)不止有一個(gè)組合類(lèi)型。在第n個(gè)組合類(lèi)型中匹配結果可以通過(guò)向后掃描來(lái)獲取到。向后掃描使得搜索重復的單詞非常簡(jiǎn)單:\b(\w+)\s+\1\b。

圓括號形成了一個(gè)組合類(lèi)型,在這個(gè)正則表示中它是第一組合類(lèi)型(也是僅有的一個(gè))。向后掃描\1,指的是任何被\w+所匹配的單詞。我們的正則表達式因此能匹配這樣的單詞,它有一個(gè)或多個(gè)空格符,后面還跟有一個(gè)與此相同的單詞。注意的是,尾部的定位類(lèi)型(\b)必不可少,它可以防止發(fā)生錯誤。如果我們想匹配"Paris in the the spring",而不是匹配"Java‘s regex package is the theme of this article"。根據java現在的格式,則上面的正則表達式就是:Pattern pattern =Pattern.compile("\\b(\\w+)\\s+\\1\\b");

最后進(jìn)一步的修改是讓我們的匹配器對大小寫(xiě)敏感。比如,下面的情況:"The the theme of this article is the Java‘s regex package.",這一點(diǎn)在regex中能非常簡(jiǎn)單地實(shí)現,即通過(guò)使用在Pattern類(lèi)中預定義的靜態(tài)標志CASE_INSENSITIVE :

Pattern pattern =Pattern.compile("\\b(\\w+)\\s+\\1\\b",

Pattern.CASE_INSENSITIVE);

有關(guān)正則表達式的話(huà)題是非常豐富,而且復雜的,用Java來(lái)實(shí)現也非常廣泛,則需要對regex包進(jìn)行的徹底研究,我們在這里所講的只是冰山一角。即使你對正則表達式比較陌生,使用regex包后會(huì )很快發(fā)現它強大功能和可伸縮性。如果你是個(gè)來(lái)自Perl或其他語(yǔ)言王國的老練的正則表達式的黑客,使用過(guò)regex包后,你將會(huì )安心地投入到j(luò )ava的世界,而放棄其他的工具,并把java的regex包看成是手邊必備的利器。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
(89) 正則表達式 (中) / 計算機程序的思維邏輯
JAVA正則表達式
java正則表達式去除html中所有的標簽和特殊HTML字符(以&開(kāi)頭的)
java正則表達式 非捕獲組,捕獲組詳解
Java過(guò)濾特殊字符的正則表達式 - Java - JavaEye論壇
java 正則表達式的使用
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久