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

使用regex返回两个不同字符串之间的所有文本,除非它找到一个新的节,regex,string-matching,Regex,String Matching,我需要从磁盘读取一个文本文件,并返回两个不同字符串之间的所有行(这部分我已经解决了)。但是如果发现一个新的部分没有包含E:include,那么它不应该返回任何内容 因此,我有一个文本文件: [NT_BASIC] "SYSTEM" WARNING 1 GB * 0000 2400 "SYSTEM" MINOR 500 MB

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

因此,我有一个文本文件:

[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:)
(?=NT\U BASIC)([\s\s]*?)(?我有这个:

(?我有:


(?如果支持,您可以使用负前瞻,但不包括匹配紧跟新行和
[
字符的行

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

  • ^
    字符串的开头
  • \[NT\U BASIC]
    匹配
    [NT\U BASIC]
  • (?:
    非捕获组
    • ,\[[^\r\n\]*]
      匹配一个逗号,后跟从开始到结束的括号
      […]
  • )*
    重复0多次
  • (?:
    非捕获组
    • \r?\n(?!\r?\n\[)
      匹配一个换行符,断言直接右边的不是紧跟着
      [
    • *
      匹配整行
  • )*
    关闭分组并重复0多次
  • \r?\n“E:”
    匹配一个换行符,后跟
    “E:”


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

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


如果支持,则可以使用负前瞻,但不包括匹配紧跟新行和
[
字符的行

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

  • ^
    字符串的开头
  • \[NT\U BASIC]
    匹配
    [NT\U BASIC]
  • (?:
    非捕获组
    • ,\[[^\r\n\]*]
      匹配一个逗号,后跟从开始到结束的括号
      […]
  • )*
    重复0多次
  • (?:
    非捕获组
    • \r?\n(?!\r?\n\[)
      匹配一个换行符,断言直接右边的不是紧跟着
      [
    • *
      匹配整行
  • )*
    关闭分组并重复0多次
  • \r?\n“E:”
    匹配一个换行符,后跟
    “E:”


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

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



你能把你的预期产出也写出来吗,这让它更清晰了。补充…谢谢:)改变了目标…现在更清晰了,我想:)这是您需要的输出吗?为什么要搜索到E?是的,就是这样…目标是:我需要自动理解驱动器E中包含的内容:。例如,在本例中,我只想知道“其他”和“DB2”应丢弃NT_BASIC,因为它不在磁盘上。E:您能把您的预期输出也放进去吗,它使它更清楚。添加了…谢谢:)更改了目标…现在更清楚了,我想:)这是您需要的输出吗?为什么要搜索到E?是的,就是这样…目标是:我需要自动理解驱动器E中包含的内容:。例如,在这种情况下,我只想知道“其他”和“DB2”应该放弃NT\U BASIC,因为它不在磁盘上。E:谢谢你的回答。但是,如果在E::)之前找到新分区,我不想返回任何内容。谢谢你的回答。但是,如果在E::)之前找到新分区,我不想返回任何内容。谢谢。它适用于NT\U BASIC-它不返回任何内容。但是例如,如果我将其更改为“OTHERS”(^[OTHERS](?:\r?\n(?)\r?\n[).**\r?\n“E:”),它应该返回“OTHERS”和“E:”之间的每一行,包括这两行:)@AntonioBarrote你的意思是这样的吗?可以不使用“before and after E:”?因为我需要在powershell上运行它,而命令应该是:[regex]::match((获取内容C:\file.cfg,“^[其他](?:,[[^\r\n]]*])*(?:\r?\n(?!\r?\n[)*))*\r?\n“E:”)。组[1]。Value@AntonioBarrote例如,您可以匹配包含
E:
的整行,而不匹配双引号@AntonioBarrote,使用
-Raw
选项
[regex]::match((获取内容-原始C:\osit\etc\df\u mon.cfg),“(?m)^\[其他\](?:,\[^\r\n\]*])*(?:\r?\n(?)\r?\n\[).\r?\n.*.\r?\n.*.\r?\n.*)。值
谢谢..它适用于NT\U BASIC-它不返回任何内容。但如果我将其更改为“其他”,例如(^[其他](?:\r?:\n(?)\r?\n.*.*.*)\r?:)它应该返回“其他”和“E”之间的每一行:“,包括这两个:)@AntonioBarrote你是说这样吗?可以不用“E:”之前和之后吗?因为我需要在powershell上运行这个命令,命令应该是:[regex]::match((Get Content C:\file.cfg,“^[其他](?:,[^\r\n]]*])*(?:\r?\n(?!\r?\n[).**\r?\n“E:”)。Groups[1].Value@AntonioBarrote例如,您可以在不匹配双引号@AntonioBarrote的情况下匹配包含
E:
的整行代码,使用
-Raw
选项
[regex]::match((Get Content-Raw C:\osit\etc\df\u mon.cfg),“(?m)^\[OTHERS\](?:,\[^\r\n\]*])*(?:\r?\n(?)\r?\n\\[)*)*。”值