RegEx 匹配第二个破折号出现后的任何内容

RegEx Match anything after second dash occurrence

有以下字​​符串样本

"01:23:45 - site name1 - message received1"
"01:23:45 - site name2 - message received2"
"01:23:45 - site name3 - message received3"
"01:23:45 - site name4 - message received4"

我希望得到:

"message received1"
"message received2"
"message received3"
"message received4"

实际上我通过使用 this

得到了这个结果
string pattern = @"(?:[^-\n]+-){2}(.*)$";
string input = @"
01:21:42 - site name1 - message received1
02:22:43 - site name2 - message received2
03:23:44 - site name3 - message received3
04:24:45 - site name4 - message received4";

RegexOptions options = RegexOptions.Multiline | RegexOptions.IgnoreCase;

foreach (Match m in Regex.Matches(input, pattern, options))
{
 Console.WriteLine("{0}", m.Groups[1].Value);
}


但仅作为 Group[1] 的匹配,因为在 Group[0] 中我得到了每一行的完整匹配。那么问题来了,有没有什么办法可以不用和Groups打交道就可以得到这个结果呢?使用多个组是否存在任何性能问题?

没有正则表达式的替代方法

string input = @"
   01:21:42 - site name1 - message received1
   02:22:43 - site name2 - message received2
   03:23:44 - site name3 - message received3
   04:24:45 - site name4 - message received4";

var messages = input
  .Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
  .Select(line => line.Split('-').Last().Trim())
  .ToArray();

Console.WriteLine(string.Join(Environment.NewLine, messages));

输出

message received1
message received2
message received3
message received4

.NET 支持在 lookbehind(?<=

中使用量词 {2}

您可以省略 RegexOptions.IgnoreCase,因为该模式不仅仅匹配小写字符。

您可以将模式更改为仅获取 m.Value

 (?<=(?:[^-\n]+-){2}).+$

.NET Regex demo

例如

string pattern = @"(?<=(?:[^-\n]+-){2}).+$";
string input = @"
01:21:42 - site name1 - message received1
02:22:43 - site name2 - message received2
03:23:44 - site name3 - message received3
04:24:45 - site name4 - message received4";

RegexOptions options = RegexOptions.Multiline;

foreach (Match m in Regex.Matches(input, pattern, options))
{
    Console.WriteLine("{0}", m.Value);
}

输出

 message received1
 message received2
 message received3
 message received4