Notepad++ 正则表达式在匹配项不存在时选择完整文件

Notepad++ regex selecting full file when match is not present

这是我的第一个问题,请多多包涵,我会尽量写得整洁完整!

我正在尝试使用正则表达式在 Notepad++ 中执行查找和替换,但我得到了一些我不理解的奇怪结果。有人可以解释一下我哪里出错了以及我可以做些什么来实现我想要的结果吗?

我使用的是 Notepad++ 版本 6.8.3

我有许多日志文件,其中所有客户信息都必须编辑。我必须找到文本 Name: 并将其后的所有内容替换为 *REDACTED* 这必须使用 "Replace in Files" 来完成。具体实例如下:

applicantDetailsCommand.firstName: Arnold 
blah blah blah blah blah blah blah blah blah blah blah
applicantDetailsCommand.middleName: Judas
applicantDetailsCommand.lastName: Rimmer
blah blah blah blah blah blah blah blah
blah blah blah blah
applicantDetailsCommand.firstName: Dave 
applicantDetailsCommand.middleName: Cinzano Bianco
applicantDetailsCommand.lastName: Lister
blah blah blah blah blah blah
blah blah blah

为了做到这一点,我开始使用后视法进行搜索: (?<=Name: ).*$ 它运行良好,找到了名字、姓氏等之后的所有条目。但是,在任何不包含 "Name: " 的文件中,整个文件都匹配,包括所有行,所以我不能在 [=37] 中使用它=] 因为它只会用“*已编辑*”替换整个文件。

然后我尝试在不使用后视的情况下匹配字符串,因此搜索了 (Name: ).*$ 并打算用 \*REDACTED\* 替换它,这很有效,但我也发现它选择了其他几行,例如我不想要的 "host_name" 和 "URIName"。

在这一点上,我决定使用一个只有我真正想要匹配的备选方案的组,所以尝试了这个: (first|middle|last|account)Name: .*$ 当文件中不存在 accountName、firstName、middleName 或 lastName 时,它​​开始匹配完整文件。

我在 tinterweb 上阅读了很多不同的文章,但找不到任何内容来解释为什么在没有匹配项时会匹配整个文件。

任何帮助解释这一点将不胜感激。

非常感谢。

确保在搜索和替换 window.

中禁用复选框“. 查找 \r 和 \n”

查找内容:Name: .*
替换为:Name: *REDACTED*

即使您在 Find what 模式之前添加组 (first|middle|last|account),此方法也应该有效。具体设置请参考下面的gif:(顺便说一句,我使用的是6.8.6版本)

当文件包含您的搜索时会发生什么:

当它不存在时会发生什么:

丢失 $ 因为这通常意味着 字符串结尾 除非多行模式。

但是,您不需要多行模式。而且你必须关闭
点表示所有字符,因此它将匹配除换行符以外的任何字符。

最后,如果 Name:
,使用 (?<=Name: ).*$ 可能会导致回溯问题 没有找到。

丢掉lookbehind,让它找到:Name:\h.*替换Name: REDACTED

这确实是一个错误 - 经过大量搜索,我最终在 GitHub 上找到了这个: https://github.com/notepad-plus-plus/notepad-plus-plus/issues/683

这似乎只有在使用分组和超过一定长度的文件时才会发生。在一个文件中,将其一分为二使我找不到 (?<=\d{8}(,|:) ).*?(?=>|\)) 的匹配项,同时保持文件完整导致正则表达式选择了整个文件。奇怪的是,虽然在相同文件中搜索 (?<=\d{4}(,|:) ).*?(?=>|\)) 工作正常 - 第一组中的数字长度是 4 而不是 8,否则相同!

此外,在另一次搜索中,我将问题中的一个原始正则表达式从 (first|middle|last|account)Name: .*$ 修改为 (first|middle|last)Name: .*$,这也开始起作用,保持相同的正则表达式并将文件。我还尝试了 (rst|dle|ast|unt)Name: .*$,它失败了,(first|middle|account)Name: .*$,它起作用了,所有这些都是随机的,不能被任何一个问题所束缚。

这让我相信正则表达式引擎中存在一个根本问题,因此我们现在放弃将 Notepad++ 作为解决方案并购买其他东西,因为不能依赖正则表达式引擎是正确的。

希望对某人有所帮助。