我需要解析一个具有多行标题、任意数量的多行详细信息和多行页脚的文件。每个细节都以一个模式开始,页脚也以一个模式开始。假设每个细节都以“detail”开头,页脚以“footer”开头,我可以通过以下方式成功找到每个细节:(?s)detail.*?(?=(detail|footer))
,接下来是下一个细节或页脚。
我的问题是我希望一个正则表达式查找包含特定单词的详细信息,而另一个正则表达式查找不包含该单词的详细信息。第二个正则表达式不是问题,因为我正在循环文件,如果我在当前偏移量处找不到第一个正则表达式,我会尝试第二个正则表达式,这样第二个正则表达式就不需要指定“和”不包含这个词”。
我知道我可以简单地使用(?s)detail.*?(?=(detail|footer))
,然后查看该单词是否在该匹配项中,但我正在使用不允许更改逻辑的现有框架。
我对第一个正则表达式所做的尝试导致了包含多个详细信息的匹配,直到找到包含该单词的匹配。如果在下一个“详细信息”或“页脚”之前找不到该单词,我会需要匹配失败。
例如,如果文件包含:
header bla bla
bla bla
detail one bla
bla bla
detail two bla
bla bla SpecialWord bla
footer
bla bla
当准备好找到第一个细节时,我希望第一个正则表达式失败,因为第一个“细节”和第二个“细节”之间没有 SpecialWord 以使第二个细节成功,返回:
detail one bla
bla bla
但是,我的失败尝试导致了正则表达式匹配:
detail one bla
bla bla
detail two bla
bla bla SpecialWord bla
如何制作一个以“详细信息”开头,在下一个“详细信息”或“页脚”之前结束,并且其中有 SpecialWord 的正则表达式?对于示例中的第一个详细信息,它将失败(因为 SpecialWord 不在第一个“详细信息”和第二个“详细信息”之间),而对于第二个详细信息,它将成功(因为 SpecialWord 在第二个“详细信息”和“页脚”之间。
任何帮助,将不胜感激。
您可以从细节开始匹配该行。然后继续匹配所有不以详细信息或页脚开头或包含 SpecialWord 的行。
然后匹配包含 SpecialWord 的行,然后匹配不以细节或页脚开头的其余行。
^detail\b.*(?:\r?\n(?!detail\b|footer\b|.*\bSpecialWord\b).*)*\r?\n.*\bSpecialWord\b.*(?:\r?\n(?!detail\b|footer\b).*)*
解释
-
^
行首
-
detail\b.*
匹配细节和线条的其余部分
-
(?:
Non capture group
-
\r?\n(?!detail\b|footer\b|.*\bSpecialWord\b).*
如果不以页脚详细信息开头或包含 SpecialWord,则匹配该行
-
)*
关闭组并重复 0 次以上以匹配所有这些行
-
\r?\n.*\bSpecialWord\b.*
匹配包含 SpecialWord 的行
-
(?:
Non capture group
-
\r?\n(?!detail\b|footer\b).*
如果不以详细信息或页脚开头,则匹配该行
-
)*
关闭组并重复 0 次以上以匹配所有这些行
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)