轉貼 用正規表示式解析C 檔案 Updated

2021-03-31 15:51:07 字數 3126 閱讀 3782

想必很多讀者都寫過給程式**按語法著色的程式。而這在一段時間以前是一件很困難的事。你需要寫大量**分析語法——而這往往又是最困難的部分。直到,

正規表示式(regular expression)的出現,我們才可以從繁重的工作中解脫。正規表示式提供了一系列方法(標準、模式),使我們

能夠高效地建立、比較和修改字串,以及迅速地分析大量文字和資料以搜尋、移除和替換文字模式

[1]

。dot*** framework 提供了 system.text.regularexpression 命名空間來實現他們承諾的功能。

1. 正規表示式[2]

首先,我想先簡單介紹一下正規表示式。

正規表示式最早是由數學家stephen kleene於2023年提出,他是在對自然語言的遞增研究成果的基礎上提出來的。具有完整語法的正規表示式使用在字元的格式匹配方面上,後來被應用到熔融資訊科技領域。自從那時起,正規表示式經過幾個時期的發展,現在的標準已經被iso(國際標準組織)批准和被open group組織認定。

正規表示式並非一門專用語言,但它可用於在乙個檔案或字元裡查詢和替代文字的一種標準。它具有兩種標準:基本正規表示式(bre),擴充套件正規表示式(ere)。ere包括bre功能和另外其它的概念。

先進已有xsh,egrep,sed,vi以及在unix平台下的程式實現了正規表示式。它們可以被很多語言採納,如html 和xml,這些採納通常只是整個標準的乙個子集。隨著正規表示式移植到交叉平台的程式語言的發展,它的功能也日益完整,使用也逐漸廣泛。

2. 相關的表示式

有關正規表示式我只能說這麼多了——它是乙個不小的知識體系,不可能用只言片語就解釋清楚。這裡我只介紹與c#語法分析相關的結個匹配串。詳細內容請參見本blog站的收藏 regular expression specification [ the open group ] 。 另外,如果你已經對正規表示式有了相當的了解,那你可以略過下面每一條的解釋,以盡快完成全文。

i> 字串

"(//?.)*?"

正規表示式中除 . $ ^ (/.|(/s)+|;|,|/(|/[)

篇幅所限,這兒只列出了很少幾個關鍵字(c#有至少80個關鍵字 ^_^)。需要注意的是,解析器會匹配左邊第乙個成功項。因此,具有包含關係的單詞應注意順序:包含者要放在被包含者之前。例如:(in|int) 解析其會查不到 int,所以應該是 (int|in)。

除此之外還有,所有的括號 (/|/]|/)) 。

3. 相關類與其成員

[3]

[serializable]

public class

regex : iserializable

// 表示不可變的正規表示式。

regex類包含若干靜態方法,使您無需顯式建立regex物件即可使用正規表示式。使用靜態方法等效於構造regex物件,使用該物件一次然後將其銷毀。

以上摘自微軟的開發文件。我們還需要用到它的幾個成員:

// 在指定的輸入字串中搜尋 regex 建構函式中指定的正規表示式匹配項

。public

match match(

string intput

)對於 match 類

[serializable]

public class

match : group

// 表示單個正規表示式匹配的結果。有關 group 的詳細資訊請參見微軟開發文件。

我們會用到它的下列成員

// 原始字串中發現捕獲的子字串的從零開始的起始位置。

public int

index

// 捕獲的子字串的長度。

public int

length

// 通過匹配捕獲的實際子字串。

public int

value

// 獲取乙個值,該值指示匹配是否成功。

public bool

success

// 獲取由正規表示式匹配的組的集合。

public virtual

groupcollection groups

// 從上乙個匹配結束的位置(即在上乙個匹配字元之後的字元)開始

// 返回乙個包含下乙個匹配結果的新 match。

public

match nextmatch();

以及 group 類的相應成員(上面列出的 match 的成員中,前四個屬性都是由 group 類繼承而來,因此這些成員將不再一一列出)。

匹配字串必須在 regex 類的例項初始化的時候指定。你可以使用建構函式建立乙個例項,使用它,然後銷毀它。或者直接使用靜態方法,這等效於建立例項。不過,經過測試,我發現靜態方法要稍稍慢於編譯的 regex 物件。請看下面的一組測試資料:

4. 撰寫**

我們現在需要對第三節中列出的c#語言元素進行分析。我所採取的是逐行分析(如果要採取多行分析,則相關表示式需要進行修改[4]

)。 using

system.text.regularexpression;

// some other codes ... ...

// 首先建立 regex 例項(以字串的解析為例)。

regex doublequotedstring = new

regex( "/"(?.)*?/"" );

// 然後去匹配字串。

match m;

for( m = doublequotedstring.match( strsomecodes ) ; m.success ; m.nextmatch() ) 

剩下的事就是寫著色**了。

5. 源**

注:[1] "能夠……文字模式"

引自 .*** framework 常規參考 中的 正規表示式語言元素

[2] 正規表示式簡介此處

[3] 本節中出現的類與函式的簽名與注釋均出自微軟文件。

[4] 多行分析

詳情請參見 .*** framework 常規參考 正規表示式語言元素

轉貼 用正規表示式解析C 檔案 Updated

想必很多讀者都寫過給程式 按語法著色的程式。而這在一段時間以前是一件很困難的事。你需要寫大量 分析語法 而這往往又是最困難的部分。直到,正規表示式 regular expression 的出現,我們才可以從繁重的工作中解脫。正規表示式提供了一系列方法 標準 模式 使我們 能夠高效地建立 比較和修改字...

正規表示式解析

正規表示式,又稱正規表示式,常規表示式,是使用單個字串來描述.匹配一系列符合某個句法規則的字串,在很多文字編輯器中,正規表示式通常被用來檢索.替換那些符合某個模式的文字.正規表示式的語法可以自行搜尋,通常分為一下幾個方面 1 字元 可以使用普通字元匹配,例 a 使用預定義字元表示給定範圍中的某個字元...

正規表示式解析

string finalsql table23 select from table where id 10 matcher m pattern.compile a za z w a za z matcher finalsql if m.find 正規表示式實現的功能是實現分組,將finalsql的左...