使用regex返回两个不同字符串之间的所有文本,除非它找到了新的部分



我需要从磁盘中读取一个文本文件,并返回两个不同字符串之间的所有行(这部分我已经解决了(。但是,如果发现一个新的节没有包含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:">

相关内容

最新更新