亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

[轉(zhuǎn)貼]用正則表達(dá)式解析C#文件(Updated)

系統(tǒng) 3695 0

想必很多讀者都寫(xiě)過(guò)給程序代碼按語(yǔ)法著色的程序。而這在一段時(shí)間以前是一件很困難的事。你需要寫(xiě)大量代碼分析語(yǔ)法——而這往往又是最困難的部分。直到,正則表達(dá)式(Regular Expression)的出現(xiàn),我們才可以從繁重的工作中解脫。正則表達(dá)式提供了一系列方法(標(biāo)準(zhǔn)、模式),使我們能夠高效地創(chuàng)建、比較和修改字符串,以及迅速地分析大量文本和數(shù)據(jù)以搜索、移除和替換文本模式 [1] 。DotNET Framework 提供了 System.Text.RegularExpression 命名空間來(lái)實(shí)現(xiàn)他們承諾的功能。

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ù):

[轉(zhuǎn)貼]用正則表達(dá)式解析C#文件(Updated)

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ǔ)言元素




[轉(zhuǎn)貼]用正則表達(dá)式解析C#文件(Updated)


更多文章、技術(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ì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 亚洲福利 影院 | 亚洲高清在线观看 | 国产精品视频免费视频 | 免费四影虎ww4hu10 | 日韩美女强理论片 | 女人18毛片a级毛片 女人18毛片a级毛片免费 | 久久视频这里只精品3国产 久久视频这里只有精品 | 视频一区久久 | 亚洲另类图 | 久久久久综合网久久 | 欧美色久 | 91av爱爱| 日韩欧美 在线播放 | 一级在线毛片 | 色偷偷亚洲精品一区二区 | a免费国产一级特黄aa大 | 亚洲精品日本一区二区在线 | 人喾交性专区免费看 | 日日操夜夜操免费视频 | 青草青在线免费视频 | 美女又xx又xx免费 | 尤物视频在线观看视频 | 一级毛片视频免费 | 奇米四色影视 | 亚洲精品一区二区在线观看 | 久久久久国产免费 | 爱操成人网 | 久久精品国产曰本波多野结衣 | www黄com | 国内外成人免费视频 | 五月婷婷在线观看 | 免费综合网 | 国产夜色视频 | 精品国产乱码一区二区三区 | 久色中文| 99免费视频 | 国产乳摇福利视频在线观看 | 精品综合久久久久久98 | 亚洲视频成人 | 美利坚永久精品视频在线观看 | 不卡久久|