如何用regex实现指定行捕获:存在999取其上方内容,否则取空行上方内容
正则实现方案
你可以使用非贪婪匹配+正向预查的组合实现需求,无需多分支判断,单行正则就能覆盖两类场景,以\n作为换行符为例(Windows环境下替换为\r\n即可):
(numbers:(?:\n.+)*?)(?=\n999\n|\n\n)
规则说明
- 捕获组内使用非贪婪量词
*?,解决原来贪婪匹配吞掉999的问题 - 末尾的
(?=\n999\n|\n\n)是正向肯定预查,仅判断终止条件不消耗匹配内容,两个终止条件分别对应两类场景:- 匹配到
\n999\n:对应存在999且其后紧跟空行的场景,此时捕获组会自动停在999之前 - 匹配到
\n\n:对应不存在999的场景,此时捕获组停在第一个空行之前
- 匹配到
测试效果
- 第一类文件匹配结果(捕获组内容):
numbers: 32 45 - 第二类文件匹配结果(捕获组内容):
numbers: 23 45
完全符合捕获要求。
内容的提问来源于stack exchange,提问作者Maximilian
相关产品推荐
相关产品推荐

