【发布时间】:2019-04-01 14:55:10
【问题描述】:
更新
我尝试将RegexOptions.Singleline 添加到我的regex 选项中。它的工作原理是它捕获了以前未捕获的行,但它将整个文本文件放入第一个匹配项中,而不是根据需要在每个日期创建一个匹配项。
更新结束
更新 #2
在使用 Poul Bak 的修改时添加了显示匹配和组的新输出。请参阅下面标题为Poul Bak 修改的输出
的屏幕截图更新 #2 结束
最终更新
将目标框架从 4.6.1 更新到 4.7.1 并稍微调整 Poul Bak 的 reg ex 解决了所有问题。请参阅下面 Poul Bak 的回答
最终更新结束
原问题:背景
我有以下文本文件test_text.txt:
2018-10-16 12:00:01 - Error 1<CR><LF>
Error 1 text line 1<CR><LF>
Error 1 text line 2<CR><LF>
2018-10-16 12:00:02 AM - Error 2<CR><LF>
Error 2 text line 1<CR><LF>
Error 2 text line 2<CR><LF>
Error 2 text line 3<CR><LF>
Error 2 text line 4<CR><LF>
2018-10-16 12:00:03 PM - Error 3
目标
我的目标是让每个匹配项包含 3 个named 组:日期、分隔符和文本,如下所示。
注意:撇号仅用于表示匹配文本的限制。
我希望看到的比赛:
Match 1: '2018-10-16 12:00:01 - Error 1<CR><LF>'
Date group = '2018-10-16 12:00:01'
Delim group = ' - '
Text group = 'Error 1<CR><LF>Error 1 text line 1<CR><LF>Error 1 text line 2<CR><LF>'
Match 2: '2018-10-16 12:00:02 AM - Error 2<CR><LF>'
Date group = '2018-10-16 12:00:02 AM'
Delim group = ' - '
Text group = 'Error 2 text line 1<CR><LF>Error 2 text line 2<CR><LF>Error 2 text line 3<CR><LF>Error 2 text line 4<CR><LF>'
Match 3: `2018-10-16 12:00:03 PM - Error 3`
Date group = '2018-10-16 12:00:03 PM'
Delim group = ' - '
Text group = 'Error 3'
问题
我的正则表达式在第二行和后续文本行中不起作用(例如,“错误 1 文本行 1”、“错误 2 文本行 1”)没有被捕获。我希望它们会被捕获,因为我使用的是 Multiline 选项。
如何修改我的正则表达式以捕获第二行和后续文本行?
当前代码
using System;
using System.Text.RegularExpressions;
namespace ConsoleApp_RegEx
{
class Program
{
static void Main(string[] args)
{
string text = System.IO.File.ReadAllText(@"C:\Users\bill\Desktop\test_text.txt");
string pattern = @"(?<Date>\d{4}-\d{2}-\d{2}\s{1}\d{2}:\d{2}:\d{2}.*)(?<Delim>\s-\s)(?<Text>.*\n|.*)";
RegexOptions regexOptions = (RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.CultureInvariant | RegexOptions.IgnorePatternWhitespace | RegexOptions.Compiled);
Regex rx = new Regex(pattern, regexOptions);
MatchCollection ms = rx.Matches(text);
// Find matches.
MatchCollection matches = rx.Matches(text);
Console.WriteLine("Input Text\n--------------------\n{0}\n--------------------\n", text);
// Report the number of matches found.
Console.WriteLine("Output ({0} matches found)\n--------------------\n", matches.Count);
int m = 1;
// Report on each match.
foreach (Match match in matches)
{
Console.WriteLine("Match #{0}: ", m++, match.Value);
int g = 1;
GroupCollection groups = match.Groups;
foreach (Group group in groups)
{
Console.WriteLine(" Group #{0} {1}", g++, group.Value);
}
Console.WriteLine();
}
Console.Read();
}
}
}
电流输出
Poul Bak 修改的输出(在正确的轨道上,但还没有完全实现)
@"(?<Date>\d{4}-\d{2}-\d{2}\s{1}\d{2}:\d{2}:\d{2}(?:\s\w\w)?)(?<Delim>\s-\s)(?<Text>([\s\S](?!\d{4}))*)"
【问题讨论】: