羅恒洋 張林
摘要:隨著信息技術(shù)的高速發(fā)展,計(jì)算機(jī)面臨著大量的數(shù)據(jù)處理業(yè)務(wù)。文本字符串處理是一種經(jīng)常性的業(yè)務(wù),正則表達(dá)式在復(fù)雜字符串處理方面有著得天獨(dú)厚的優(yōu)勢。文章介紹了Java語言中的正則表達(dá)式處理方法,分析了復(fù)雜字符串的分割、查找、替換和提取特殊子串的方法,總結(jié)了構(gòu)建正則表達(dá)式重要性。
關(guān)鍵詞:文本;字符串;正則表達(dá)式;模式;Java
中圖分類號(hào):TP312 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2019)32-0095-04
1背景
處理文本和數(shù)據(jù)是計(jì)算機(jī)經(jīng)常要做的事情,諸如存儲(chǔ)在數(shù)據(jù)庫的數(shù)據(jù)、文本編輯處理、網(wǎng)上注冊(cè)、填報(bào)登記的信息、網(wǎng)站新聞列表等應(yīng)用上都涉及大量處理文本和數(shù)據(jù)的操作。有時(shí)可能不知道需要處理的大量文本數(shù)據(jù)的具體內(nèi)容,但是若把這些文本和數(shù)據(jù)以一種能讓計(jì)算機(jī)識(shí)別和處理的模式表現(xiàn)出來,再讓計(jì)算機(jī)分析和處理文本和數(shù)據(jù)就變得方便了,這就是正則表達(dá)式技術(shù)的運(yùn)用,正則表達(dá)式的運(yùn)用給計(jì)算機(jī)處理大量文本數(shù)據(jù)帶來快速和簡便的操作。
2正則表達(dá)式元字符
正則表達(dá)式(Regular Expressionl是由一些字符和特殊字符組成的字符串,這個(gè)字符串描述了字符和字符的重復(fù)排列方式,反映了字符重復(fù)排列的規(guī)律性,因此能夠按某種模式匹配一些有相似特征的字符串或字符串集合。運(yùn)用正則表達(dá)式首先要理解正則表達(dá)式的元字符集提供的字符和特殊字符的含義。
2.1正則表達(dá)式支持的字符
正則表達(dá)式支持的合法字符如表1所示。
表1所列的是可以在正則表達(dá)式中使用的常規(guī)字符,利用常規(guī)字符也可以定義正則表達(dá)式,如”abc\nabc”匹配”abc\nabc”,字符串自身匹配自身。Java語言中,java.util.regex包下有兩個(gè)重要的類:Pattern和Matcher,這兩個(gè)類提供了定義正則表達(dá)式和匹配目標(biāo)字符串的主要操作。實(shí)際工作中,要用到Pattern中的matches方法,判斷某個(gè)正則表達(dá)式與目標(biāo)字符串是否匹配。matches方法是Pattern類的一個(gè)類方法,方法的返回值是boolean型數(shù)據(jù),該方法需要兩個(gè)參數(shù),第一個(gè)參數(shù)是定義的正則表達(dá)式,即某種形式的模式,第二個(gè)參數(shù)是要匹配的目標(biāo)字符串,當(dāng)某個(gè)正則表達(dá)式與目標(biāo)字符串匹配成功,方法返回true值,否則返回false,通常用matches方法測試定義的正則表達(dá)式能否匹配目標(biāo)字符串。
要構(gòu)造靈活的正則表達(dá)式就要用到正則表達(dá)式的特殊字符、預(yù)定義字符、邊界匹配符和方括號(hào)、圓括號(hào)表達(dá)式。
2.2正則表達(dá)式的特殊字符
正則表達(dá)式的特殊字符如表2所示。
2.5圓括號(hào)表達(dá)式
當(dāng)把多個(gè)字符當(dāng)作一個(gè)獨(dú)立單元進(jìn)行處理時(shí),就要用到圓括號(hào)表達(dá)式了,即用圓括號(hào)把多個(gè)字符分成一個(gè)子組,結(jié)合管道運(yùn)算符可以可以構(gòu)造關(guān)鍵詞匹配正則表達(dá)式。
“((public)I(protected)I(private))”用于匹配Java的三個(gè)訪問控制符之一。
在正則表達(dá)式中用一對(duì)圓括號(hào)可以把正則表達(dá)式分組,每一個(gè)子組能夠保留下來做進(jìn)一步的處理。假定要匹配的目標(biāo)字符串中既含有英文字符又含有數(shù)字字符,可以使用正則表達(dá)式”(\\w+)-(\\d+)”來匹配,在Java中把目標(biāo)字符串分成兩個(gè)子組,并且兩個(gè)子組匹配結(jié)果在Matcher類中以子組的形式保留下來,非常方便地進(jìn)行下一步處理。而傳統(tǒng)的做法需要編寫兩段程序代碼,先從目標(biāo)字符串中分離處英文字符并保存下來,再從目標(biāo)字符串中分離出數(shù)字字符,做進(jìn)一步處理,處理過程比使用圓括號(hào)運(yùn)算符復(fù)雜得多。
2.6數(shù)量標(biāo)識(shí)符支持的模式
特殊符號(hào)*、?、+用于匹配字符串模式出現(xiàn)一次、多次或未出現(xiàn)的情況,又稱作閉包運(yùn)算符或量詞。*(星號(hào))運(yùn)算符匹配它左邊那個(gè)正則表達(dá)式出現(xiàn)0次或0次以上的情況。+(加號(hào))運(yùn)算符匹配它左邊那個(gè)正則表達(dá)式出現(xiàn)1次或多次的情況。?f問號(hào))運(yùn)算符匹配它左邊那個(gè)正則表達(dá)式出現(xiàn)0次或1次的情況。
花括號(hào){}運(yùn)算符也是用來匹配其左邊正則表達(dá)式出現(xiàn)的情況,花括號(hào)內(nèi)可以是一個(gè)值、一個(gè)值跟一個(gè)逗號(hào)或由逗號(hào)分隔的兩個(gè)值。fml表示匹配其左邊那個(gè)正則表達(dá)式m次出現(xiàn),{m,}表示匹配其左邊那個(gè)正則表達(dá)式至少出現(xiàn)m次;{m,n}表示匹配其左邊那個(gè)正則表達(dá)式至少出現(xiàn)m次,最多出現(xiàn)n次。
構(gòu)建正則表達(dá)式時(shí)使用了表示重復(fù)的元字符(*、+、?、{m,n})說明了正則表達(dá)式引擎在執(zhí)行模式匹配時(shí)的工作模式。Java語言中支持三種工作模式,第一貪婪模式(Greedv),重復(fù)元字符默認(rèn)工作模式,貪婪模式的表達(dá)式會(huì)一直匹配下去,直到無法匹配為止。第二非貪婪模式(Reluctant)又稱勉強(qiáng)模式,用問號(hào)后綴(?)表示,它只匹配最少的字符,也稱為最小匹配模式。第三占有模式(Possessive),用加號(hào)后綴(+)表示,目前只有Java語言支持該模式,通常比較少用。
上面第一行使用貪婪模式匹配第一個(gè)出現(xiàn)的單詞,輸出結(jié)果x替換掉Hello,第二行使用非貪婪模式匹配,即匹配最少的字符,Hello,Java前的第0個(gè)字符替換成x。
3正則表達(dá)式的應(yīng)用
正則表達(dá)式是一個(gè)強(qiáng)大的字符串處理工具,互聯(lián)網(wǎng)上的網(wǎng)頁文件其實(shí)質(zhì)是一個(gè)龐大的字符串文件,利用正則表達(dá)式可以對(duì)字符串進(jìn)行查找、提取、分割和替換等操作。
3.1Pattern和Marcher類
Pattern類和Matcher類位于iava.util.regex包內(nèi),兩者都是終極類,一旦在程序中定義了正則表達(dá)式,就可以用這兩個(gè)類的對(duì)象來使用正則表達(dá)式。Pattern對(duì)象用來保存編譯后的正則表達(dá)式,編譯后的正則表達(dá)式可以在程序中反復(fù)使用,提高程序執(zhí)行的效率,利用Pattern對(duì)象創(chuàng)建Matcher對(duì)象,執(zhí)行模式匹配所涉及的狀態(tài)保留在Matcher對(duì)象中,多個(gè)Matcher對(duì)象可以共享同一個(gè)Pattern對(duì)象。典型的調(diào)用順序如下:
從字符串中提取特定子字符串,操作方法基本相同,只是所定義的正則表達(dá)式內(nèi)容不同。
4結(jié)束語
正則表達(dá)式在大量文本字符處理上有著得天獨(dú)厚的技術(shù)優(yōu)勢,傳統(tǒng)的文本處理技術(shù)算法不僅復(fù)雜而且代碼臃腫,執(zhí)行效率也低。信息技術(shù)的高速發(fā)展促進(jìn)處理大量文本數(shù)據(jù)的正則表達(dá)式技術(shù)的發(fā)展,很多計(jì)算機(jī)高級(jí)語言演化也是從不支持正則表達(dá)式技術(shù)轉(zhuǎn)化為支持正則表達(dá)式技術(shù),并且不斷優(yōu)化正則表達(dá)式技術(shù),Java語言就是這樣的一種語言,Java語言從1.4版以來就支持正則表達(dá)式技術(shù),在目前見到的Java語言的各個(gè)版本中,都有著優(yōu)化和改進(jìn)正則表達(dá)式功能的說明。正則表達(dá)式的關(guān)鍵是構(gòu)建一個(gè)正則表達(dá)式模式,該模式能反映出文本字符串的排列特征,從而用該模式代表符合特征的大量具體的文本字符串,為進(jìn)一步的處理提供便捷。