1

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

(?::(?<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();

但我不喜欢我必须在代码中单独拆分它。有没有办法可以从middle组中获取一组匹配项?

4

1 回答 1

4

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

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

@"(?::(?<Prefix>[^ ]+) +)?(?<Command>[^ :]+)(?<middle>(?: +[^ :]+))*(?<coda> +:(?<trailing>.*)?)?"

其次,你会这样做:

parameters.AddRange(match.Groups["middle"].Captures.
                    OfType<Capture>().
                    Select(c => c.Value));
于 2012-12-19T19:43:06.207 回答