如何解决RegEx从最后一次出现的字符串开始
我有一个文本文件,其中有一个数据集,我想从中删除一些记录。看起来像这样:
我可以使用某个关键字来标识不需要(或不需要)的记录。我想使用RegEx,并利用此关键字和分隔符字符串删除所有这些表达式。 删除记录的“底部”部分效果很好,但是当我尝试使用以下方法删除“顶部”部分时:
= separator =。*?unwantedKeyword
匹配的开始是第一个可用的= separator =(第5行),而不是end关键字(第11行)之前的最后一个(第9行)。
导致想要的记录被删除。是否可以仅匹配该字符串的最后一个实例(模拟数据中的= separator =),所以仅匹配第1.至3.和9.至10行,而不是1.至3.和5.至11行会被替换?
编辑:
或者我想只是使其反向读取文件? Notepad ++禁用了RegEx的该选项,因此不确定是否可行。
解决方法
如果您要删除第1至3行以及第9至11行,则可以使用前瞻性来防止匹配以=separator=
开头或包含不想要的关键字的所有行。
^=separator=.*(?:\R(?!(?:=separator=|.*?\bunwantedKeyword\b)).*)*\R.*?\bunwantedKeyword\b.*\R*
,
我会用
(?s)=separator=(?:(?!=separator=).)*?unwantedKeyword
请参见proof。
说明
--------------------------------------------------------------------------------
(?s) set flags for this block (with . matching \n)
--------------------------------------------------------------------------------
=separator= '=separator='
--------------------------------------------------------------------------------
(?: group,but do not capture (0 or more times
(matching the least amount possible)):
--------------------------------------------------------------------------------
(?! look ahead to see if there is not:
--------------------------------------------------------------------------------
=separator= '=separator='
--------------------------------------------------------------------------------
) end of look-ahead
--------------------------------------------------------------------------------
. any character
--------------------------------------------------------------------------------
)*? end of grouping
--------------------------------------------------------------------------------
unwantedKeyword 'unwantedKeyword'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。