使用正则表达式 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\[)
如果删除第二部分,它将匹配到 "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:"
另一种选择是使用否定字符 class 匹配所有不以空白字符或 [
字符开头的行。
如果您也不想匹配 "E:"
两边的双引号,您可以一直匹配到第一次出现 E"
^\[NT_BASIC](?:,\[[^\r\n\]]*])*\r?\n(?:[^\s\[].*\r?\n)*.*?\bE:
我需要从磁盘读取一个文本文件和 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\[)
如果删除第二部分,它将匹配到 "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:"
另一种选择是使用否定字符 class 匹配所有不以空白字符或 [
字符开头的行。
如果您也不想匹配 "E:"
两边的双引号,您可以一直匹配到第一次出现 E"
^\[NT_BASIC](?:,\[[^\r\n\]]*])*\r?\n(?:[^\s\[].*\r?\n)*.*?\bE: