我有以下文字
Reference=*\G{7B35DDAC-FFE2-4435-8A15-CF5C70F23459}#1.0#0#..\..\..\bin\App Components\AcmeFormEngine.dll#ACME Form Engine
并希望将以下内容作为两个独立的捕获组获取:
AcmeFormEngine.dll
ACME Form Engine
有人可以帮忙吗?
答案 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
简而言之,这是神秘的..尽可能避免。