如何编写.Net正则表达式以匹配从行尾返回

时间:2008-10-14 11:11:03

标签: .net regex

我有以下文字

Reference=*\G{7B35DDAC-FFE2-4435-8A15-CF5C70F23459}#1.0#0#..\..\..\bin\App Components\AcmeFormEngine.dll#ACME Form Engine

并希望将以下内容作为两个独立的捕获组获取:

AcmeFormEngine.dll
ACME Form Engine

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:5)

如果你对字符串格式很诚恳,你也可以用地球方式解决这个问题,而不用正则表达式:在'\'的最后一个索引之后取出所有内容,并将其拆分为'#'。

答案 1 :(得分:1)

    using System.Text.RegularExpressions;

    Regex regex = new Regex(
    @"\\(?<filename>[\w\.]+)\#(?<comment>[\w ]+)$",
    RegexOptions.IgnoreCase
    | RegexOptions.Compiled
    );

答案 2 :(得分:1)

Regex r = new Regex("\\(.+?)\#(.+?)$");

非贪婪的多重性非常好。

'$':匹配字符串的结尾。

"\#(.+?)":匹配从字符串末尾到第一个'#'字符的所有内容,并在捕获中返回该字符。

"\\(.+?)":同样的,除了转义'\'。

答案 3 :(得分:1)

我投票支持tomalask的非正则表达方法。 但是,如果您不得不使用正则表达式,我认为您需要这样的东西

\\([^\\/?"<>|]+?)\#([^\\/?"<>|]+?)[\r\n]*$

这将允许在文件名中有效的 - 和_之类的东西,它的2个相同的组(每个不包括win32文件名的无效字符)以斜杠开头,由#和行尾($)分隔。假设第二组也是有效的win32文件名.. 我在匹配的第二组中看到了一些丑陋的盒子,[\ r \ n] *让它们远离。

e.g. F5C70F23459}#1.0#0#..\..\..\bin\App Components\Acme_Form-Engine.dll#ACME Form Engine
group#1 => Acme_Form-Engine.dll
group#2 => ACME Form Engine

简而言之,这是神秘的..尽可能避免。