RegEx 在第二次破折号出现后匹配任何内容[重复]
Posted
技术标签:
【中文标题】RegEx 在第二次破折号出现后匹配任何内容[重复]【英文标题】:RegEx Match anything after second dash occurrence [duplicate] 【发布时间】:2020-08-03 19:31:07 【问题描述】:有以下字符串样本
"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]
中,我对每一行都进行了完整匹配。所以问题是,有没有什么方法可以得到这个结果而不必与组打交道?是否存在与使用多个组相关的性能问题?
【问题讨论】:
您正在使用两个组,一个非捕获组(?:[^-\n]+-)
和一个捕获组(.*)
。你能检查Group[0]
和Group[1]
并查看它的.Captures
属性吗?查看Match.Groups documentation中的第一个代码示例
参见***.com/a/30501096/3832970 展示它是如何完成的。
【参考方案1】:
.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
【讨论】:
这就像一个魅力!我正在使用不支持 .Net 的 regex101.com 测试我的正则表达式。感谢您的帮助!【参考方案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";
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
【讨论】:
以上是关于RegEx 在第二次破折号出现后匹配任何内容[重复]的主要内容,如果未能解决你的问题,请参考以下文章
在第二次使用任何 Async api 调用后,Pi 上的 Bot 崩溃