首页 > 解决方案 > 使用正则表达式返回两个不同字符串之间的所有文本,除非它找到一个新部分

问题描述

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

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

[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)([\s\S]*?)(?<=E:)

但是,由于有一个新的信息部分(一个空行,后跟“[”和另一个部分类型 - 在本例中为“ [OTHERS],[DB2] ”),我不想返回任何内容。

有没有办法使用正则表达式来实现这一点?

标签: regexstring-matching

解决方案


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

^\[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:"

正则表达式演示


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

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

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

正则表达式演示


推荐阅读