在.NET Regex中,将零宽度正向前瞻断言与其他搜索项相结合



我需要解析一个具有多行标题、任意数量的多行详细信息和多行页脚的文件。每个细节都以图案开头,页脚以图案开头。假设每个细节以";"细节";,并且页脚以";页脚";,我可以用:(?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正则表达式演示

相关内容