C# 正在修复RegEx Split()函数-空字符串作为第一项
预先编写代码,将我面临的问题形象化一点:C# 正在修复RegEx Split()函数-空字符串作为第一项,c#,.net,regex,split,C#,.net,Regex,Split,预先编写代码,将我面临的问题形象化一点: 这是需要拆分的文本 这是我的正则表达式 Regex r = new Regex(@"\:\d{2}\w*\:", RegexOptions.Multiline); MatchCollection matches = r.Matches(Content); string[] items = r.Split(Content); // ----- Fix for first entry being empty string. int index
Regex r = new Regex(@"\:\d{2}\w*\:", RegexOptions.Multiline);
MatchCollection matches = r.Matches(Content);
string[] items = r.Split(Content);
// ----- Fix for first entry being empty string.
int index = items[0] == string.Empty ? 1 : 0;
foreach (Match match in matches)
{
MessageField field = new MessageField();
field.FieldIdExtended = match.Value;
field.Content = items[index];
Fields.Add(field);
index++;
}
从注释中可以看到,字符串的拆分出现了问题。
它返回一个空字符串作为第一项。
有什么优雅的方法可以解决这个问题吗
谢谢,Dimi使用:
string[] items = r.Split(Content, StringSplitOptions.RemoveEmptyEntries);
删除空条目。之所以出现此行为,是因为拆分中的第一个分隔符之前没有任何内容,并且第一个条目为空 正确解决这个问题的方法可能是捕获正则表达式中所需的值,然后从匹配集中获取它 粗略地一猜,你可能想要这样的东西:
Regex r = new Regex(@"^:(?<id>\d{2}\w*):(?<content>.*)$", RegexOptions.Multiline);
MatchCollection matches = r.Matches(Content);
foreach (Match match in matches)
{
MessageField field = new MessageField();
field.FieldIdExtended = match.Groups["id"].ToString()
field.Content = match.Groups["content"].ToString();
Fields.Add(field);
}
Regex r=newregex(@“^:(?\d{2}\w*):(?*)$”,RegexOptions.Multiline);
MatchCollection matches=r.matches(内容);
foreach(匹配中的匹配)
{
MessageField=newmessagefield();
field.FieldIdExtended=match.Groups[“id”].ToString()
field.Content=match.Groups[“Content”].ToString();
字段。添加(字段);
}
使用命名的捕获组可以很容易地提取内容。您可能需要调整正则表达式,使其更符合您的需要。目前,它将20
作为id,将0444453880181732
作为内容。我不是100%清楚您需要捕获什么,但是您使用正则表达式看起来还不错,所以我认为这不是问题。:)
本质上,这里你不是真的试图拆分东西,而是匹配东西并将其拉出。+1很好,我正要发布类似的东西。有两件事:(1)您的最后一组应该引用“内容”而不是“测试”;(2)不需要转义
:
(OP也这样做),(3)您应该能够在正则表达式的末尾去掉\n
;如果有任何问题,请在开始和结束时分别使用^
和$
。(4) 我更喜欢.Value
而不是.ToString()
@ahmaged:谢谢。1是因为我意识到,当我把代码粘贴到问题中时,我不应该称之为测试,而忘记了到处更新。2我在阅读问题时注意到了,但随后C&Ped了他的正则表达式并对其进行了修改,忘记删除转义。3是一个很好的点,我现在用^和$将它改为锚定在行的开头和结尾。感谢您的反馈。:)对代码的单个更正:(?*)应该是(?。\w*),因此我有正确的内容:)其余的都很好&因此被接受,非常感谢!!!修复不需要的空字符串的另一种方法是使用一点LINQ:string[]items=r.Split(Content).Where(s=>!string.IsEmpty(s)).ToArray()
。如果正则表达式很难得到正确的结果,那么这可能会更简单(因此更容易维护),而不是针对单个(匹配开始)特殊情况调整正则表达式。这里的问题是在匹配的同时获得匹配表达式,如果只是关于拆分,那么当然你是对的,还有更多的选项可供选择。。。
Regex r = new Regex(@"^:(?<id>\d{2}\w*):(?<content>.*)$", RegexOptions.Multiline);
MatchCollection matches = r.Matches(Content);
foreach (Match match in matches)
{
MessageField field = new MessageField();
field.FieldIdExtended = match.Groups["id"].ToString()
field.Content = match.Groups["content"].ToString();
Fields.Add(field);
}