C# 用于解析IRC消息的正则表达式

C# 用于解析IRC消息的正则表达式,c#,regex,irc,C#,Regex,Irc,我认为用正则表达式进行解析会很好。我做到了这一点: (?::(?<Prefix>[^ ]+) +)?(?<Command>[^ :]+)(?<middle>(?: +[^ :]+)*)(?<coda> +:(?<trailing>.*)?)? (?::(?[^]+)+)(?[^:]+)(?(?:+[^:]+)*(?+:(?*)? 然后,我将其与以下.NET代码一起使用,以获取消息的显著元素: Prefix = matches.Gro

我认为用正则表达式进行解析会很好。我做到了这一点:

(?::(?<Prefix>[^ ]+) +)?(?<Command>[^ :]+)(?<middle>(?: +[^ :]+)*)(?<coda> +:(?<trailing>.*)?)?
(?::(?[^]+)+)(?[^:]+)(?(?:+[^:]+)*(?+:(?*)?
然后,我将其与以下.NET代码一起使用,以获取消息的显著元素:

Prefix = matches.Groups["Prefix"].Value;
Command = matches.Groups["Command"].Value;

var parameters = new List<string>();
parameters.AddRange(matches.Groups["middle"].Value
    .Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries));
parameters.Add(matches.Groups["trailing"].Value);

Parameters = parameters.ToArray();
Prefix=matches.Groups[“Prefix”].Value;
Command=matches.Groups[“Command”].Value;
var参数=新列表();
parameters.AddRange(匹配.Groups[“middle”]。值
.Split(新[]{”“},StringSplitOptions.RemoveEmptyEntries));
parameters.Add(匹配.Groups[“training”].Value);
Parameters=Parameters.ToArray();

但我不喜欢这样,我必须在代码中分开。是否有一种方法可以从
中间组
中获取匹配数组?

您可以使用重复组的
捕获
属性,尽管我不建议这样做

首先,您需要将模式更改为:

@"(?::(?<Prefix>[^ ]+) +)?(?<Command>[^ :]+)(?<middle>(?: +[^ :]+))*(?<coda> +:(?<trailing>.*)?)?"
@“(?::(?[^]+)+)(?[^:]+)(?(?:+[^:]+)*(?+:(?*)?”
第二,你要做:

parameters.AddRange(match.Groups["middle"].Captures.
                    OfType<Capture>().
                    Select(c => c.Value));
parameters.AddRange(match.Groups[“middle”])捕获。
OfType()。
选择(c=>c.Value));

您以什么格式接收这些消息?
RawMessage
是字符串。在internet上快速搜索会得到这些结果:@Eve这两个结果都没有回答我的问题:获取参数数组。正如您所看到的,我的正则表达式已经完成了那些正则表达式所做的工作。@Superbest并非所有语言都支持重复捕获组(例如Java)。如果你曾经不得不移植你的代码,你很可能会遇到讨厌的bug。@Eve如果你总是使用这个参数,那么你最终会编写与Brainf*ck兼容的代码。