使用正则表达式 return 两个不同字符串之间的所有文本,除非它找到一个新的部分

using regex to return all text between two different strings, except if it finds a new section

我需要从磁盘读取一个文本文件和 return 两个不同字符串之间的所有行(这部分我已经解决了)。但是如果发现一个新的部分没有包含 E:,那么它不应该 return 任何东西。

所以,我有这个文本文件:

[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

而且,使用这个表达式,我能够 return [NT_BASIC] 和 E:

之间的所有文本
(?=NT_BASIC)([\s\S]*?)(?<=E:)

但是,由于有一个新的信息部分(空行,后跟“[”和另一个部分类型 - 在本例中为“[OTHERS],[DB2] "), 我什么都不想return

有没有办法使用正则表达式实现此目的?

我有这个:

(?<=\[NT_BASIC\]\s)([\s\S]*?)(?="E:|\s\[)

测试:https://regexr.com/51pf4

如果删除第二部分,它将匹配到 "E:"

如果支持排除匹配后跟换行符和 [ 字符的行,则可以使用否定前瞻。

^\[NT_BASIC](?:,\[[^\r\n\]]*])*(?:\r?\n(?!\r?\n\[).*)*\r?\n"E:"

说明

  • ^ 字符串开头
  • \[NT_BASIC] 匹配 [NT_BASIC]
  • (?:非捕获组
    • ,\[[^\r\n\]]*] 匹配一个逗号后跟一个左括号到右括号[...]
  • )* 重复 0+ 次
  • (?:非捕获组
    • \r?\n(?!\r?\n\[) 匹配一个换行符,断言直接在右边的不是换行符后面跟[
    • .*匹配整行
  • )*关闭组重复0+次
  • \r?\n"E:" 匹配换行符后跟 "E:"

Regex demo


另一种选择是使用否定字符 class 匹配所有不以空白字符或 [ 字符开头的行。

如果您也不想匹配 "E:" 两边的双引号,您可以一直匹配到第一次出现 E"

^\[NT_BASIC](?:,\[[^\r\n\]]*])*\r?\n(?:[^\s\[].*\r?\n)*.*?\bE:

Regex demo