我需要解析一个具有多行标题、任意数量的多行详细信息和多行页脚的文件。每个细节都以图案开头,页脚以图案开头。假设每个细节以";"细节";,并且页脚以";页脚";,我可以用:(?s)detail.*?(?=(detail|footer))
成功地找到每个细节,然后是下一个细节或页脚。
我的问题是,我希望一个正则表达式查找包含特定单词的详细信息,另一个正则函数查找不包含该单词的详细内容。第二个正则表达式不是问题,因为我正在循环浏览文件,如果在当前偏移量处找不到第一个正则表达式,我会尝试第二个,这样第二个regex就不需要指定"并且不包含那个词";。
我知道我可以简单地使用(?s)detail.*?(?=(detail|footer))
,然后看看这个词是否在匹配中,但我使用的是一个不允许更改逻辑的现有框架。
我为第一个正则表达式所做的尝试导致了一个包含多个细节的匹配,直到它找到一个包含该单词的匹配。相反,如果在下一个"匹配"之前没有找到单词,我需要匹配失败;细节";或";页脚";。
例如,如果文件包含:
header bla bla
bla bla
detail one bla
bla bla
detail two bla
bla bla SpecialWord bla
footer
bla bla
当准备好查找第一个细节时,我希望第一个正则表达式失败,因为在第一个"细节";第二个表示第二个成功,返回:
detail one bla
bla bla
然而,我失败的尝试导致正则表达式匹配:
detail one bla
bla bla
detail two bla
bla bla SpecialWord bla
我如何制作一个以"开头的正则表达式;"细节";,在下一个"结束"之前结束;细节";或";页脚";,里面有SpecialWord吗?对于示例中的第一个细节,它将失败(因为SpecialWord不在第一个"细节"和第二个之间(,而对于第二个细节,则会成功(因为SpecialWord在第二个"详情"one_answers"页脚"之间(
如有任何帮助,我们将不胜感激。
您可以匹配以细节开头的行。然后继续匹配所有不以细节或页脚开头或包含SpecialWord的行。
然后匹配包含SpecialWord的行,然后匹配不以细节或页脚开头的其余行。
^detailb.*(?:r?n(?!detailb|footerb|.*bSpecialWordb).*)*r?n.*bSpecialWordb.*(?:r?n(?!detailb|footerb).*)*
解释
^
线路起点detailb.*
匹配细节和其余部分(?:
非捕获组r?n(?!detailb|footerb|.*bSpecialWordb).*
如果不是以页脚细节开头或包含SpecialWord,则匹配该行
)*
关闭组并重复0+次以匹配所有这些行r?n.*bSpecialWordb.*
匹配包含SpecialWord的行(?:
非捕获组r?n(?!detailb|footerb).*
如果不是以细节或页脚开头,则匹配行
)*
关闭组并重复0+次以匹配所有这些行
.NET正则表达式演示