[英]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.