2013-03-25 12 views
0

所以我想寫一個正則表達式來過濾特定片段的文本文件(尋找速度而不是蠻力)。另一個MultiLine組正則表達式查詢

我想從每場比賽得到三樣東西:

  • 一個關鍵標識片斷
  • 可選語言格式化的每個片段中
  • 代表所有起始和結束標籤之間的行

這是正則表達式(一個失敗的測試工具可以在這裏找到 - https://gist.github.com/shiftkey/5236161):

(?s)code start (?<key>[A-Za-z-]*) (?<language>[A-Za-z]*).*[\n](?<value>.*?)[\n].*end code (?<key>[A-Za-z-]*)

使用這些選項:RegexOptions.Compiled | RegexOptions.ExplicitCapture | RegexOptions.Multiline

所以像這樣的文件:

// code start foo csharp 
var x = 1; 
// end code foo 

給我的預期值:

  • 關鍵:富
  • 語言:csharp的
  • var x = 1;

但是,當我介紹一個片段與第二排我只得到了最後一排:

// code start foo csharp 
var x = 1; 
var y = 2; 
// end code foo 
  • 關鍵:富
  • 語言:csharp的
  • var y = 2;

而不是

  • var x = 1;\r\nvar y = 2;(或類似)

有什麼我錯過了獲得羣體覆蓋多行?

我看過在SO上提出的類似場景,但他們沒有用於我的用法。

+0

使用單線,而不是多到「」匹配「\ n」? http://stackoverflow.com/questions/289440/cannot-get-regular-expression-work-correctly-with-multiline – Lanorkin 2013-03-25 10:38:40

+0

我想解析任何類型的文本文件 - 不只是XML。我可以用C#或紅寶石或任何有意見的語言來做樣本... – 2013-03-25 10:38:55

回答

1

這可以通過改變兩個.* S中的貪婪,周圍的工作:

(?s)code start (?<key>[A-Za-z-]*) (?<language>[A-Za-z]*).*?[\n](?<value>.*)[\n].*?end code (?<key>[A-Za-z-]*) 

.*閱讀的語言必須是貪心不足,因爲我們需要的第一個新行作爲後的內容後,代碼段值。然而,解析value.*可能更貪婪,因爲它不應該在遇到第一個\n時停止,因此上述模式。

+0

謝謝!正是我需要的! – 2013-03-25 10:44:02

0

如果你願意,你可以做抓一些環視的東西,以及......

(?<=code\sstart\s)(?<key>\b\w+\b)\s(?<language>\b\w+\b).*\r\n(?<content>(?s).*)(?=\r\n.*end\scode\s\1\s-->) 
+0

我有一個更方便的空白容忍版本,但我也希望支持任何文本文件有評論。所以在這種情況下尋找XML開放/關閉評論標籤不會幫助我。 – 2013-03-25 12:47:56

+0

如果需要,總是可以跳過打開/關閉標籤:)以爲你希望它是嚴格的:P – cyberzed 2013-03-25 13:33:53