我需要从磁盘中读取一个文本文件,并返回两个不同字符串之间的所有行(这部分我已经解决了(。但是,如果发现一个新的节没有包含E:included,那么它就不应该返回任何内容。
所以,我有这个文本文件:
[NT_BASIC]
"SYSTEM" WARNING 1 GB * 0000 2400
"SYSTEM" MINOR 500 MB * 0000 2400
[OTHERS],[DB2]
"D:" WARNING 1 GB * 0000 2400
"D:" MINOR 500 MB * 0000 2400
"E:" WARNING 1 GB 1-5 0700 1700
"E:" MINOR 500 MB 1-5 0700 1700
"F:" WARNING 5 % 1-5 0700 1700
"F:" MINOR 2 % 1-5 0700 1700
"H:" WARNING 1 GB 1-5 0700 1700
"H:" MINOR 500 MB 1-5 0700 1700
使用这个表达式,我可以返回[NT_BASIC]和E:之间的所有文本
(?=NT_BASIC)([sS]*?)(?<=E:)
然而,由于有一个新的信息部分(一个空行,后面跟着"["和另一个部分类型——在本例中是">[OTHERS],[DB2]"(,我不想返回任何信息。
有没有一种方法可以使用regex实现这一点?
如果支持,可以使用负前瞻,排除匹配换行符和[
字符后面的行。
^[NT_BASIC](?:,[[^rn]]*])*(?:r?n(?!r?n[).*)*r?n"E:"
解释
^
字符串开始[NT_BASIC]
匹配[NT_BASIC]
(?:
非捕获组,[[^rn]]*]
匹配逗号后的左括号[...]
)*
重复0+次(?:
非捕获组r?n(?!r?n[)
匹配一个换行符,断言直接右边的不是后面跟着[
的换行符.*
全线匹配
)*
关闭群组并重复0+次r?n"E:"
匹配后面跟有"E:"
的换行符
Regex演示
另一个选项是使用否定字符类匹配所有不以空白字符或[
字符开头的行。
如果你也不想匹配"E:"
周围的双引号,你可以匹配到第一次出现E"
^[NT_BASIC](?:,[[^rn]]*])*r?n(?:[^s[].*r?n)*.*?bE:
Regex演示
我有这个:
(?<=[NT_BASIC]s)([sS]*?)(?="E:|s[)
测试:https://regexr.com/51pf4
如果删除第二部分,它将匹配到"E:">