我需要分析由第三方工具创建的结果文件。因此我尝试创建一个小的 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)*?\[ )。惰性(即不贪婪)重复会导致大量回溯,因此会损害性能。因此,最好尽可能使用否定字符类来代替惰性重复。
