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