Regex 记事本++;不存在匹配项时选择完整文件的正则表达式

Regex 记事本++;不存在匹配项时选择完整文件的正则表达式,regex,notepad++,regex-lookarounds,Regex,Notepad++,Regex Lookarounds,这是我的第一个问题,所以请容忍我,而我试图写这整洁和完整的尽可能 我试图使用正则表达式在记事本++中执行查找和替换,但我得到了一些我不理解的奇怪结果。有人能解释一下我哪里出了问题,我能做些什么来达到我想要的结果吗 我正在使用记事本++版本6.8.3 我有许多日志文件,其中任何客户信息都必须进行编辑。我必须找到文本名称:,并用*编辑的*替换后面的所有内容。这必须使用“在文件中替换”来完成。具体实例的示例如下: applicantDetailsCommand.firstName: Arnold b

这是我的第一个问题,所以请容忍我,而我试图写这整洁和完整的尽可能

我试图使用正则表达式在记事本++中执行查找和替换,但我得到了一些我不理解的奇怪结果。有人能解释一下我哪里出了问题,我能做些什么来达到我想要的结果吗

我正在使用记事本++版本6.8.3

我有许多日志文件,其中任何客户信息都必须进行编辑。我必须找到文本
名称:
,并用
*编辑的*
替换后面的所有内容。这必须使用“在文件中替换”来完成。具体实例的示例如下:

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
为了做到这一点,我开始使用“向后看”进行搜索,因此:
(?确保禁用“搜索和替换”窗口中的“.finds\r\n”复选框。

查找内容:
名称:.*

替换为:
Name:*已编辑*

即使在
查找模式之前添加组
(第一个|中间|最后一个|帐户)
,此方法也应该有效。请参阅下面的GIF以了解确切设置:(顺便说一下,我使用的是版本6.8.6)

当文件包含搜索时会发生什么情况:

如果没有,会发生什么:

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

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


最后,使用
(?这确实是一个bug-经过多次搜索,我最终在GitHub上找到了这个bug:

这似乎只在使用分组和对特定长度的文件进行分组时才会发生。在一个文件中,将其一分为二使我找不到与
(?|\)
匹配的文件,而保持文件完整则导致正则表达式选择整个文件。奇怪的是,尽管搜索
(?|\))
在相同的文件中工作正常-第一组中的数字长度为4而不是8,否则相同

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

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


希望这对其他人有所帮助。

嗨,对不起-我应该说我已经禁用了“.matches newline”复选框,我想是相同的吗?谢谢如果你让实际的名字模式更具体怎么办?而不是“*”,类似“\w+(?:\s+\w+”?”的内容,不幸的是,这给了我相同的结果。不过,感谢您的输入,我还没有尝试过。另一个想法可能是在Perl或Python中尝试。也许这只是NP++中的一个bug…?当您运行
(first | middle | last | account)Name:.$
查找所有文件时,您会说它正在报告匹配完整文件。如果您禁用了matches newline,那么这似乎是一个bug,因为它应该报告每个匹配的行号。你的正则表达式看起来不错。也许你应该升级到6.8.7?是的,当我在文件中查找时,两个“buggy”搜索都匹配它们应该匹配的所有项目,但是如果有一个不匹配的文件,它会从头到尾匹配整个文件。当我有匹配项时,这对我有效,但当没有匹配项时,则不适用-整个文件会高亮显示。该文件的大小足够140Mb,因此不确定这是否会影响它,但如果我单独搜索“firstName”或“lastName”或“accountName”或“middleName”,则没有匹配项。这可能是我使用的版本中的一个bug?很好,我没有想到。*在换行时停止。话虽如此,正则表达式的最后一部分在有比赛时起作用,这是我所期望的,但我从未想过在没有比赛时它会有什么反应。我早上上班时会试试这个。如果你不介意的话,你有回溯问题的例子或解释吗?我想了解为什么会发生这种情况,而不仅仅是让我自己去修理。谢谢。@Begbie007-定义断言时,内容总是作为一个独立的上下文运行,并从周围的上下文中删除。它只向调用者返回true或false。这意味着周围的上下文不能作为单个上下文进行优化。从而为潜在的回溯问题打开了大门。这就是为什么像这样的
*(名称:).$
会立即失败,而像这样的
会立即失败*(?感谢您的解释,我确实意识到使用lookaround需要更长的时间,但没有意识到将它们开放式不是一个好主意。我尝试了您的建议,但我看到了与以前相同的结果,
Name:\h.*
起作用,但选择太多。当我尝试
(account | first | middle | last)名称:\h.*
即使我没有选择换行符,也会选择不匹配的整个文件以及换行符。匹配换行符。我从未使用过np++但我知道大多数引擎默认为点与换行符不匹配。如果情况更糟,您应该能够使用
(?-s)(名称:).*
它使用内联修饰符关闭点所有。内联修饰符的作用域是这样的,它们覆盖所有全局标志。如果这不起作用,我就不会使用np++,它完全是垃圾。另一个尝试是
(名称:)[^\r\n]*
,其中
[^\r\n]
(?-s)
几乎相同。感谢您的支持