修复RegEx Split()函数 - 将空字符串作为第一个条目

Dim*_*kis 5 .net c# regex split

提前编写代码以使我面临的问题可视化:

  1. 这是需要拆分的文本.
:20:0444453880181732
:21:0444453880131350
:22:CANCEL/ABCDEF0131835055
:23:BUY/CALL/E/EUR
:82A:ABCDEFZZ80A
:87A:4444655604
:30:061123
:31G:070416/1000/USNY
:31E:070418
:26F:PRINCIPAL
:32B:EUR1000000,00
:36:1,31000000
:33B:USD1310000,00
:37K:PCT1,60000000
:34P:061127USD16000,00
:57A:ABCDEFZZ80A
Run Code Online (Sandbox Code Playgroud)

这是我的正则表达式

 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++;
 }
Run Code Online (Sandbox Code Playgroud)

从注释中可以看出,分裂字符串时会出现问题.它作为第一项返回一个空字符串.有没有优雅的方法来解决这个问题?

谢谢,迪米

Chr*_*ris 4

您出现此行为的原因是拆分中的第一个分隔符之前没有任何内容,并且第一个条目为空。

正确解决此问题的方法可能是捕获正则表达式中所需的值,然后从匹配集中获取它。

粗略地初步猜测,您可能想要类似的东西:

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);

}
Run Code Online (Sandbox Code Playgroud)

使用命名捕获组可以轻松提取内容。您可能需要将正则表达式调整为您想要的更多。目前它获取20id 和0444453880181732内容。我不是 100% 清楚你需要捕获什么,但你看起来对正则表达式没问题,所以我认为这不是问题。:)

本质上,在这里你并不是真的试图分割东西,而是匹配东西并将其拉出来。