1. 正則表達(dá)式 [2]
首先,我想先簡(jiǎn)單介紹一下正則表達(dá)式。
正則表達(dá)式最早是由數(shù)學(xué)家Stephen Kleene于1956年提出,他是在對(duì)自然語(yǔ)言的遞增研究成果的基礎(chǔ)上提出來(lái)的。具有完整語(yǔ)法的正則表達(dá)式使用在字符的格式匹配方面上,后來(lái)被應(yīng)用到熔融信息技術(shù)領(lǐng)域。自從那時(shí)起,正則表達(dá)式經(jīng)過(guò)幾個(gè)時(shí)期的發(fā)展,現(xiàn)在的標(biāo)準(zhǔn)已經(jīng)被ISO(國(guó)際標(biāo)準(zhǔn)組織)批準(zhǔn)和被Open Group組織認(rèn)定。
正則表達(dá)式并非一門(mén)專用語(yǔ)言,但它可用于在一個(gè)文件或字符里查找和替代文本的一種標(biāo)準(zhǔn)。它具有兩種標(biāo)準(zhǔn):基本正則表達(dá)式(BRE),擴(kuò)展正則表達(dá)式(ERE)。ERE包括BRE功能和另外其它的概念。
先進(jìn)已有xsh,egrep,sed,vi以及在UNIX平臺(tái)下的程序?qū)崿F(xiàn)了正則表達(dá)式。它們可以被很多語(yǔ)言采納,如HTML 和XML,這些采納通常只是整個(gè)標(biāo)準(zhǔn)的一個(gè)子集。隨著正則表達(dá)式移植到交叉平臺(tái)的程序語(yǔ)言的發(fā)展,它的功能也日益完整,使用也逐漸廣泛。
2. 相關(guān)的表達(dá)式
有關(guān)正則表達(dá)式我只能說(shuō)這么多了——它是一個(gè)不小的知識(shí)體系,不可能用只言片語(yǔ)就解釋清楚。這里我只介紹與C#語(yǔ)法分析相關(guān)的結(jié)個(gè)匹配串。詳細(xì)內(nèi)容請(qǐng)參見(jiàn)本Blog站的收藏 Regular Expression Specification [ The Open Group ] 。 另外,如果你已經(jīng)對(duì)正則表達(dá)式有了相當(dāng)?shù)牧私猓悄憧梢月赃^(guò)下面每一條的解釋,以盡快完成全文。
i> 字符串 "(\\?.)*?" 正則表達(dá)式中除 . $ ^ { [ ( | ) * + ? \ 外,其他字符與自身匹配。在上面的式子中,兩邊的quotation mark就是指匹配字符串兩邊的引號(hào)。“\\”表示一個(gè)“\”字符。后面緊跟的“?”表示匹配零個(gè)或一個(gè)字符。“.” 與除 \n 之外的任何字符匹配。 “()”表示捕獲匹配的子字符串。使用 () 的捕獲根據(jù)左括號(hào)的順序從1 開(kāi)始自動(dòng)編號(hào)。捕獲元素編號(hào)為零的第一個(gè)捕獲是由整個(gè)正則表達(dá)式模式匹配的文本。括號(hào)后面的“*”表示存在一個(gè)或多個(gè)這樣的子字符串。即“*”是作用于“(\\?.)”的。 “?”的存在使空字符串也可以被捕獲。 ii> 逐字字符串 @"(""|.)*?" 匹配類似于 @"Hello ""World ""!" 的字符串。 與用 | (垂直條)字符分隔的任何一個(gè)術(shù)語(yǔ)匹配;例如, cat|dog|tiger 。使用最左側(cè)的成功匹配。 iii> C# 文檔信息中的xml元素///\s*<.*> 匹配C#自動(dòng)化XML文檔。“\s”表示任何空白字符。需要注意的是,請(qǐng)不要隨意修改大小寫(xiě)。因?yàn)樵谡齽t表達(dá)式是大小寫(xiě)敏感的,在它的通配符中,大小寫(xiě)字符往往表示完全相反的意思。比如,“\S”表示任何非空白字符。(下面的“\Z”也是這樣) iv> C# 文檔信息中的內(nèi)容///\s?.* v> 空行^\s*\Z “^”指定匹配必須出現(xiàn)在字符串的開(kāi)頭或行的開(kāi)頭。而“\Z”表示指定匹配必須出現(xiàn)在字符串的結(jié)尾或字符串結(jié)尾的 \n 之前。 vi> C# 注釋//.* vii> C# 關(guān)鍵字(abstract|where|while|yield){1}(\.|(\s)+|;|,|\(|\[){1} 篇幅所限,這兒只列出了很少幾個(gè)關(guān)鍵字(C#有至少80個(gè)關(guān)鍵字 ^_^)。需要注意的是,解析器會(huì)匹配左邊第一個(gè)成功項(xiàng)。因此,具有包含關(guān)系的單詞應(yīng)注意順序:包含者要放在被包含者之前。例如:(in|int) 解析其會(huì)查不到 int,所以應(yīng)該是 (int|in)。 除此之外還有,所有的括號(hào) (\{|\[|\(|\}|\]|\)) 。 |
3. 相關(guān)類與其成員 [3]
[Serializable] public class Regex : ISerializable // 表示不可變的正則表達(dá)式。 |
Regex 類包含若干靜態(tài)方法,使您無(wú)需顯式創(chuàng)建 Regex 對(duì)象即可使用正則表達(dá)式。使用靜態(tài)方法等效于構(gòu)造 Regex 對(duì)象,使用該對(duì)象一次然后將其銷毀。
Regex 類是不可變(只讀)的,并且具有固有的線程安全性。可以在任何線程上創(chuàng)建 Regex 對(duì)象,并在線程間共享。
以上摘自微軟的開(kāi)發(fā)文檔。我們還需要用到它的幾個(gè)成員:
// 在指定的輸入字符串中搜索 Regex 構(gòu)造函數(shù)中指定的正則表達(dá)式匹配項(xiàng) 。 public Match Match( string intput ) |
對(duì)于 Match 類
[Serializable] public class Match : Group // 表示單個(gè)正則表達(dá)式匹配的結(jié)果。有關(guān) Group 的詳細(xì)信息請(qǐng)參見(jiàn)微軟開(kāi)發(fā)文檔。 |
我們會(huì)用到它的下列成員
// 原始字符串中發(fā)現(xiàn)捕獲的子字符串的從零開(kāi)始的起始位置。 public int Index { get; }
// 捕獲的子字符串的長(zhǎng)度。 public int Length { get; }
// 通過(guò)匹配捕獲的實(shí)際子字符串。 public int Value { get; }
// 獲取一個(gè)值,該值指示匹配是否成功。 public bool Success { get; }
// 獲取由正則表達(dá)式匹配的組的集合。 public virtual GroupCollection Groups { get; }
// 從上一個(gè)匹配結(jié)束的位置(即在上一個(gè)匹配字符之后的字符)開(kāi)始 // 返回一個(gè)包含下一個(gè)匹配結(jié)果的新 Match。 public Match NextMatch(); |
以及 Group 類的相應(yīng)成員(上面列出的 Match 的成員中,前四個(gè)屬性都是由 Group 類繼承而來(lái),因此這些成員將不再一一列出)。
匹配字符串必須在 Regex 類的實(shí)例初始化的時(shí)候指定。你可以使用構(gòu)造函數(shù)創(chuàng)建一個(gè)實(shí)例,使用它,然后銷毀它。或者直接使用靜態(tài)方法,這等效于創(chuàng)建實(shí)例。不過(guò),經(jīng)過(guò)測(cè)試,我發(fā)現(xiàn)靜態(tài)方法要稍稍慢于編譯的 Regex 對(duì)象。請(qǐng)看下面的一組測(cè)試數(shù)據(jù):
![]() |
4. 撰寫(xiě)代碼
我們現(xiàn)在需要對(duì)第三節(jié)中列出的C#語(yǔ)言元素進(jìn)行分析。我所采取的是逐行分析(如果要采取多行分析,則相關(guān)表達(dá)式需要進(jìn)行修改 [4] )。
using System.Text.RegularExpression; // Some other codes ... ... // 首先創(chuàng)建 Regex 實(shí)例(以字符串的解析為例)。 Regex DoubleQuotedString = new Regex("\"(\\\\?.)*?\""); // 然后去匹配字符串。 Match m; for (m=DoubleQuotedString.Match(strSomeCodes);m.Success;m.NextMatch()){ foreach (Groupg in m.Groups){ // Do some drawings } } |
剩下的事就是寫(xiě)著色代碼了。
5. 源代碼
![]() |
注: [1] "能夠……文本模式" 引自 .NET Framework 常規(guī)參考 中的 正則表達(dá)式語(yǔ)言元素 [2] 正則表達(dá)式簡(jiǎn)介 此處 有關(guān)正則表達(dá)式的簡(jiǎn)介參考自 ZDNet China 技術(shù)與開(kāi)發(fā) 中的相關(guān)內(nèi)容。 [3] 本節(jié)中出現(xiàn)的類與函數(shù)的簽名與注釋均出自微軟文檔。 [4] 多行分析 詳情請(qǐng)參見(jiàn) .NET Framework 常規(guī)參考 正則表達(dá)式語(yǔ)言元素 |
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
