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