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}).+$
例如
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
有以下字符串样本
"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}).+$
例如
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