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 崩溃

第二次点击后出现文本字段的键盘(不时)

sed / awk 匹配文件中第二次出现的正则表达式,并替换整行

UIView 仅在第二次调用后显示

UIButton 切换标题。仅在第二次单击后更改

日历验证错误仅在第二次通过 Jquery UI 选择日期后才消失