regex - 使用正则表达式返回两个不同字符串之间的所有文本,除非它找到一个新部分
问题描述
我需要从磁盘读取一个文本文件并返回两个不同字符串之间的所有行(这部分我已经解决了)。但是如果发现一个没有 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] ”),我不想返回任何内容。
有没有办法使用正则表达式来实现这一点?
解决方案
如果支持排除匹配后跟换行符和[
字符的行,则可以使用负前瞻。
^\[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:
推荐阅读
- tsql - 如何根据列值是否只有一条记录来过滤 NULL,T-SQL
- npm - 如何从代理后面在 Ubuntu 上安装 electronjs?
- python - 如何将列表保存到 Excel 电子表格?
- python - 在 Python 中使用 Dropbox API 访问共享链接和下载图像的问题
- elasticsearch - Open Distro for Elasticsearch on-prem Kubernetes 问题
- javascript - 单击移动设备中的项目时折叠导航栏
- csv - 从 .csv 文件转换为 .xls 文件时,如何使用 Unoconv 保留数字的前导 0?
- android - 如何对不在我的 Activity 中的片段执行 setOnClickListener?
- php - FTP 和从数组中拉取项目想要摆脱一个空数组
- dart - 飞镖中有相当于 INT_MAX 的吗?