淺談C#匹配字符串
C#匹配字符串
大多數(shù)重要的正則表達(dá)式語(yǔ)言運(yùn)算符都是非轉(zhuǎn)義的單個(gè)字符。轉(zhuǎn)義符 \(單個(gè)反斜杠)通知正則表達(dá)式分析器反斜杠后面的字符不是運(yùn)算符。例如,分析器將星號(hào) (*) 視為重復(fù)限定符,而將后跟星號(hào)的反斜杠 (\*) 視為 Unicode 字符 002A。
使用一般表達(dá)式要習(xí)慣的一點(diǎn)是,查看像這樣怪異的字符序列,但這個(gè)序列的工作是非常邏輯化的。轉(zhuǎn)義序列\(zhòng)S表示任何不適空白的字符。*稱為數(shù)量詞,其含義是前面的字符可以重復(fù)任意次,包括0次。序列\(zhòng)S*表示任何不適空白的字符。因此,上面的模式匹配于以n開(kāi)頭,以ion結(jié)尾的任何單個(gè)字。下表中列出的字符轉(zhuǎn)義在正則表達(dá)式和替換模式中都會(huì)被識(shí)別。
表1:特定字符或轉(zhuǎn)義序列
如果要搜索一個(gè)元字符,也可以通過(guò)帶有反斜杠的轉(zhuǎn)義字符來(lái)表示。例如,.表示除了換行字符以外的任何字符,而\.表示一個(gè)點(diǎn)。
可以把可替換的字符放在方括號(hào)中,請(qǐng)求匹配包含這些字符。例如,[1|c]表示字符可以是1或者是c。如果要搜索map或者man,可以使用序列"ma[n|p]"(僅指引號(hào)內(nèi)字符,下面雷同)。在方括號(hào)中,也可以制定一個(gè)范圍,例如"[a-z]"表示所有的小寫字母(使用連字號(hào) (-) 允許指定連續(xù)字符范圍),"[B-F]"表示B到F之間的所有大寫字母,"[0-9]"表示一個(gè)數(shù)字,如果要搜索一個(gè)整數(shù)(該序列只包含0到9的字符),就可以編寫"[0-9]+"(注意,使用+字符表示至少要有這樣一個(gè)數(shù)字,但可以有多個(gè)數(shù)字,所以9、83和3443等都是匹配的。)
下面看看一般表達(dá)式的結(jié)果,編寫一個(gè)實(shí)例RegularExpressionsZzy。建立幾個(gè)一般表達(dá)式,顯示其結(jié)果,讓用戶了解一下表達(dá)式是如何工作的。
該實(shí)例的核心是一個(gè)方法WriteMatches(),它把MatchCollection中的所有匹配以比較詳細(xì)的方式顯示出來(lái)。對(duì)于每個(gè)匹配,它都會(huì)顯示該匹配在輸入字符串中所在的索引,C#匹配字符串和一個(gè)略長(zhǎng)的字符串,其中包含輸入文本中至多8個(gè)外圍字符,其中至少有5個(gè)字符放在匹配的前面,至多5個(gè)字符放在匹配的后面(如果匹配的位置在輸入文本的開(kāi)頭或結(jié)尾5個(gè)字符內(nèi),則結(jié)果中匹配前后的字符就會(huì)少于4個(gè))。換言之,靠近輸入文本末尾的匹配應(yīng)是"and messaging ofd",匹配的前后各有5個(gè)字符,但位于輸入文本的***一個(gè)字上的匹配就應(yīng)是"g of data",匹配的字后只有一個(gè)字符。因?yàn)樵谠撟址暮竺媸亲址慕Y(jié)尾。這個(gè)長(zhǎng)字符串可以更清楚地表明一般表達(dá)式是在什么地方查找到匹配的:
- staticvoidWriteMatches(stringtext,MatchCollectionmatches)
- {
- Console.WriteLine("Originaltextwas:\n\n"+text+"\n");
- Console.WriteLine("No.ofmatches:"+matches.Count);
- foreach(MatchnextMatchinmatches)
- {
- intIndex=nextMatch.Index;
- stringresult=nextMatch.ToString();
- intcharsBefore=(Index<5)?Index:5;
- intfromEnd=text.Length-Index-result.Length;
- intcharsAfter=(fromEnd<5)?fromEnd:5;
- intcharsToDisplay=charsBefore+charsAfter+result.Length;
- Console.WriteLine("Index:{0},\tString:{1},\t{2}",Index,result,
- text.Substring(Index-charsBefore,charsToDisplay));
- }
- }
在這個(gè)方法中,處理過(guò)程是確定在較長(zhǎng)的字符串中有多少個(gè)字符可以顯示,而無(wú)需超限輸入文本的開(kāi)頭或結(jié)尾。注意在Match對(duì)象上使用了另一個(gè)屬性Value,它包含標(biāo)識(shí)該C#匹配字符串,而且,RegularExpressionsZzy只包含名為Find_po,F(xiàn)ind_n等的方法,這些方法根據(jù)本文執(zhí)行某些搜索操作。
【編輯推薦】