我真的花了整整两天时间在谷歌和regex101上搜索,然后再询问。
这是我的文件(数千个)的样子:
FIRST LINE THAT MIGHT CONTAIN ON .
SECTION1
SOME TEXT THAT MIGHT CONTAIN ON .
SECTION2
ON 04/1/2017 SOME TEXT
ON 25/1/2017 SOME TEXT
ON 15/2/2017 SOME TEXT
我只需删除SECTION2中的每个ON
次出现
我无法明确发布在两天的反复试验中没有工作的模式。 (它会使搜索引擎充斥着无关紧要的东西,同时证明我有限的智慧 - 关于这个主题; - )
答案 0 :(得分:1)
您可以使用此模式执行此操作:
(?:\G(?!\A)|\A(?>.*\R)*?SECTION2\h*\R)(?>.*\R)*?\KON\h
我们的想法是构建一个只能使用\G
锚点返回连续匹配的模式。此锚点在字符串的开头或成功匹配后的位置成功。
模式细节:
(?: # non-capturing group: two possible starts
\G(?!\A) # the position after a previous match
| # OR
\A(?>.*\R)*?SECTION2\h*\R # reach the first occurrence of SECTION2 from the start
)
(?>.*\R)*? # match lazily eventual lines that don't start with ON
\K # remove all on the left from the match result
ON\h # and keep only ON with a trailing space
(?!\A)
禁止第一个分支在字符串的开头成功,这样第一个匹配总是使用第二个分支(只有一次,因为它以\A
开头)。下一个匹配始终使用第一个分支。这会强制所有出现的ON都在SECTION2之后。