2013-02-13 34 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正则表达式选项。

相关问题