2013-02-13 60 views
2

我正在嘗試刪除最後一次正則表達式匹配之前的所有文本,而沒有刪除匹配或不必使用任何其他文本替換它。下面是我解析該文件的幾行樣本行:在最後一次正則表達式匹配之前修剪所有文本

N3.C2.R1:19 00000000 00000000 00 ** 0000 00000000 00000000 00000000 00000000
N0.C0.R0N3.C3.R1: .N3.C3.R0:18 00000000 00000000 00000000 00000000 00000 * 00 00000000 00000000
寫入等級1 ... N3.C1.R3:-22 0000000 * 00000000 00000000 00000000 00000 * 00 00000000 00000000

第一行是理想的行,並匹配返回應該是什麼。我的正則表達式如下:

string pattern = @"N\d\.C\d\.R\d:"; 

模式返回上述所有字符串,但我需要修剪一切,爲了返回一條線,看起來像圖案的最後一次出現之前發生的文字第一。我在這裏看過很多類似的問題,但我一直無法找到在我的代碼中真正起作用的答案,或者對我來說很有意義。

請記住,上面的例子並不是一個詳盡的可能性列表。這就是爲什麼我試圖使用正則表達式而不是字符串方法。

供參考,在這裏是通過問這個人之前我看過類似的問題:

Regex + Remove all text before match
RegEx Multple Matches in Text
Regex: Filter out text before last occurrence

編輯:我要指出,我與工作線是包含在原始文件中的非常小的信息子集。我發佈的所有示例行都是「良好」信息(即我可以使用的信息)的示例,但第一行是最終輸出的樣子。

+0

修剪什麼!......向我們展示您期望的輸入輸出 – Anirudha 2013-02-13 16:44:23

回答

2

嘗試以下操作:

string str = Regex.Replace(input, @"(.+?)(N\d\.C\d\.R\d:)", "$2"); 
+1

這個解決方案可以工作,但我爲什麼要(spugm1r3)想要這樣做,我有點困惑。簡單地返回最後一場比賽作爲結果而不操縱原始字符串不是更好嗎? – Ameen 2013-02-13 16:38:45

+0

@Ameen同意,只是返回最後一場比賽效率更高 – VladL 2013-02-13 16:42:06

+0

感謝您的快速回復。弗拉德L,你的答案是完美的。 @Ameen,說實話,我只是陷入了自己的問題。在這個項目之前,我從未使用Regex,一旦我偶然發現了一個「主要」工作模式,我就開始在這些結果中工作。也就是說,弗拉德的回答中的很多語法都是我還沒有偶然發現或者意識到的東西。在那張紙上:弗拉德,你能解釋一下2美元嗎?它顯然是有效的,我只是想知道它的機制,所以這不會成爲我的「單一」答案。 – spugm1r3 2013-02-13 16:51:15

0

這種方法也返回了什麼有可能會跟隨你的最後一場比賽(例如線的數量後的餘數):

string pattern = @"^N\d\.C\d\.R\d:"; 
var matches = Regex.Matches(input, pattern, RegexOptions.Multiline); 
if (matches.Count > 0) { 
    string result = input.Substring(matches[matches.Count - 1].Index); 
} 

我也是爲了包括^明確搜索行的開頭。這需要Multiline正則表達式選項。

相關問題