繁体   English   中英

尝试在正则表达式的帮助下在多行中找到匹配项

[英]Trying to find a match within multiple lines with help of a regex

对于很多人来说,这可能是一个简单的问题,但这对我来说还是一个难题(也许因为我对正则表达式而言是完整的n00b)。

我正在努力寻找一个正则表达式,该表达式可能有助于在大型日志信息文件中发现错误。

基本上,我需要找到一个数字,始终以Z开头,后面紧跟11位数字。 以Z00000012345为例。

此数字用于多个句子,示例如下:

144行:07:16:36:933 | 收到的重要事件:到达编号:Z00000012345
162行:07:16:42:314 | 正在处理和做非常重要的事情...
线164:07:16:42:374 | 几乎准备就绪,处理编号Z00000012345
165行:07:16:42:374 | 处理成功; 编号“ Z00000012345”已处理。

我需要找到什么:
有时会发生这样的情况:已处理的数字(单引号之间的数字)与到达系统的数字(第一行)不同。

另一个棘手的事情是,两者之间没有确切数量的固定句子。

我希望将其设置成组,因为那可能是最简单的比较,所以我开始:

(?<Found>(\barrived:\s)(\w+))

我的目标是首先捕获“到达”后面的单词,然后找到下一个与相同单词匹配的组,然后在单引号之间(如最后一行所示)。

但是,我如何轻松做到这一点? 最终,我想将其引入C#工具中。

顺便说一下,这些文件最多可以运行8 GB,因此是我寻找速度的方式。

所需的输出:
只要第一个数字(请参见示例中的第144行)和第165行的最后一个数字之间都不匹配,则所需的输出是一个标志。如果这些都不正确,则说明我不匹配。 由于这种情况非常罕见,因此我认为最好以这种方式进行搜索。

您可以尝试以下方法:

arrived:\s*(Z\d{11})((?!arrived)[\s\S])*'((?:(?!\1)[^'])+)'

这是演示: https : //regex101.com/r/RAI4Zh/1

在此处输入图片说明

只需使用此模式,并确保使用RegexOptions.Compiled来提高速度,并使用RegexOptions.MultiLine来捕获多行。

using System.Text.RegularExpressions;

string logFileContent = "Line 144: 07:16:36:933 | Important event received: number arrived: Z00000012345\r\nLine 162: 07:16:42:314 | Processing and doing extremely important stuff...\r\nLine 164: 07:16:42:374 | Almost ready with processing number Z00000012345\r\nLine 165: 07:16:42:374 | Success with processing; number 'Z00000012345' has been processed.\r\n";

string pattern = @"(?<WholeMatch>\'?(?<Number>Z\d{11})\'?)";
MatchCollection matches = Regex.Matches(logFileContent, pattern, RegexOptions.Compiled | RegexOptions.Multiline);
foreach(Match match in matches)
{
    Console.WriteLine(match.Value);
}

当然,您可以修改上面的模式以提高速度,也可以像这样简单地使用

string pattern = @"\'?(Z\d{11})\'?";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM