用正規表示式解析c#檔案(updated)
jack h hansen
[ 2004-07-28 ]
keywords
c#正規表示式(regular expression)syntax highlighting
想必很多讀者都寫過給程式**按語法著色的程式。而這在一段時間以前是一件很困難的事。你需要寫大量**分析語法——而這往往又是最困難的部分。直到,正規表示式(regular expression)的出現,我們才可以從繁重的工作中解脫。正規表示式提供了一系列方法(標準、模式),使我們能夠高效地建立、比較和修改字串,以及迅速地分析大量文字和資料以搜尋、移除和替換文字模式
[1]
。dotnet 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] "能夠……文字模式"
引自 .net framework 常規參考 中的 正規表示式語言元素
[2] 正規表示式簡介此處
[3] 本節中出現的類與函式的簽名與注釋均出自微軟文件。
[4] 多行分析
詳情請參見 .net 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的左...