Skip to main content
 首页 » 编程设计

c#之用于分析日志文件的正则表达式(多行)

2024年02月05日29haluo1

我需要分析由第三方工具创建的结果文件。因此我尝试创建一个小的 c# 工具来加载文件内容并执行正则表达式。内容看起来像这样:

[1] <Download> 13.01.2016 15:16:47 
[  
 
Name: foobar.tif 
 
Status:              0 (ok) 
] 
 
[2] <Download> 13.01.2016 15:17:50 
[ 
Name: foobar2.tif 
 
Error: 7100: No file found! 
 
] 
 
[3] <Upload> 13.01.2016 15:17:53 
[ 
 
Name: Company.tif 
 
Size: 3476 
Error: 7200: Unauthorized! 
 
] 
 
... 

我尝试创建一个匹配此类内容的正则表达式模式。在此示例中,3 个匹配项包括我需要检查的 4 个组(索引 1、2 或 3;任务下载/上传、文件名称和状态或错误的值)。可以忽略所有其他信息,如时间戳或可选的“大小”属性。

这是我想出的:

(?<Index>\[[0-9]+\]) (?<TaskName><[\w]+>) 

但现在这只匹配索引和任务名称,我不确定如何继续获取“名称”和“状态”或“错误”值,因为它们在另一行中。

编辑:

好的,我已经尝试过你的回复,这就是我到目前为止的想法:

\[(?<Index>[0-9]+?)\]\s<(?<Task>\w+?)>.+\n+\[[\s.]+Name\:\s(?<Name>.+)(?<Content>[\s\S]+?)\] 

现在我得到了索引、任务名称和名称。到目前为止方法还好吗?接下来,我将尝试将错误/状态也放入一个组中。

请您参考如下方法:

默认情况下,正则表达式模式总是跨多行捕获。该行为可以被覆盖,但如果那是您想要做的,那么您不需要做任何特别的事情来使其跨多行捕获。但是,有些字符类会考虑换行符。最值得注意的是,.字符类匹配除换行符外的所有字符。因此,如果你想捕获包括换行符在内的任何字符,你不能只使用 .*因为那只会匹配到当前行的末尾。

你可以使用 (.|\n)*但是,在可能的情况下,最好使用否定字符类。例如,如果您需要获取以下示例中括号内的值:

 [Value One] some 
 random 
 
 data 
 [Value Two] 

你可以使用 (\[(?<value>[^]]*)\][^[]*)* .注意 [^]]*用作括号内值的模式,[^[]*用作括号外所有内容的模式。否定的字符类仅表示它匹配列表中不 的任何字符。例如[^abc]将匹配任何不是 a 的字符, b , 或 c .所以,[^[] just 表示任何不是左方括号的字符。由于换行符不是方括号,它将匹配换行符以及任何其他类型的字符。

我说否定字符类比 (.|\n)* 这样的字符类更可取的原因是因为,为了使用 (.|\n)* , 你必须制作 *重复懒惰(例如 (.|\n)*?\[ )。惰性(即不贪婪)重复会导致大量回溯,因此会损害性能。因此,最好尽可能使用否定字符类来代替惰性重复。