如何用正则删除以WSPRD2#开头块中含DELESTAT的整行
解决方案:仅删除指定代码块中的目标行
需求
仅删除以WSPRD2#开头、以END结尾的代码块中包含DELESTAT的整行代码,其余代码块中的对应行保留。
测试示例代码
WSPRD3#/TO/PATH/TASK5 PRIORITY 60 NEEDS 1 MASTER#AAA0RTYU NEEDS 1 MASTER#DELESTAT NEEDS 1 MASTER#RAAA1JK FOLLOWS GET_INPUT END WSPRD2#/TO/PATH/TASK6 PRIORITY 60 NEEDS 1 MASTER#AAA0RETU NEEDS 1 MASTER#DELESTAT NEEDS 1 MASTER#RAAACCC FOLLOWS GET_INPUT END WSPRD4#/TO/PATH/TASK8 PRIORITY 60 NEEDS 1 MASTER#AAA0RETU NEEDS 1 MASTER#DELESTAT NEEDS 1 MASTER#RAAACCC FOLLOWS GET_INPUT END
问题分析
你之前尝试的正则(?s)^(WSPRD2.*?DELESTAT(?:.*?\n)*?)会匹配从WSPRD2#行到DELESTAT行的所有内容,无法精准定位并仅删除目标行,核心原因是它采用了范围覆盖式的贪婪匹配,而非针对性捕获目标行。
正确正则方案
正则表达式(PCRE风格)
(?s)(WSPRD2#(?:(?!END).)*?)(^.*DELESTAT.*$\n?)(.*?END)
替换规则
将匹配结果替换为:$1$3
正则说明
(?s):开启单行模式,使.可以匹配换行符(WSPRD2#(?:(?!END).)*?):捕获WSPRD2#开头到DELESTAT行之前的所有内容,(?:(?!END).)*?确保匹配范围不会超出当前代码块(即遇到END就停止)(^.*DELESTAT.*$\n?):精准捕获包含DELESTAT的整行(包括末尾的换行符)(.*?END):捕获DELESTAT行之后到END的所有内容
替换时通过保留$1和$3的内容,直接剔除中间捕获的DELESTAT目标行。
替换后结果
WSPRD3#/TO/PATH/TASK5 PRIORITY 60 NEEDS 1 MASTER#AAA0RTYU NEEDS 1 MASTER#DELESTAT NEEDS 1 MASTER#RAAA1JK FOLLOWS GET_INPUT END WSPRD2#/TO/PATH/TASK6 PRIORITY 60 NEEDS 1 MASTER#AAA0RETU NEEDS 1 MASTER#RAAACCC FOLLOWS GET_INPUT END WSPRD4#/TO/PATH/TASK8 PRIORITY 60 NEEDS 1 MASTER#AAA0RETU NEEDS 1 MASTER#DELESTAT NEEDS 1 MASTER#RAAACCC FOLLOWS GET_INPUT END
内容的提问来源于stack exchange,提问作者italo_pm
相关产品推荐
相关产品推荐

