Notepad++ v8.5.4正则替换异常:为何匹配最后一个冒号而非第一个?
正则匹配异常原因及解决方法
问题场景
处理如下格式的日志行:
[6268:1434][2023-07-17T03:44:08]i001: Burn v3.14.0.4118, Windows v10.0 (Build 22631: Service Pack 0), path: C:\Users\david\AppData\Local\Temp\{95942D14-E274-486C-A7FB-EDAF9E773422}\.cr\winsdksetup.exe [6268:1434][2023-07-17T03:44:08]i009: Command Line: '-burn.clean.room=E:\Downloads\winsdksetup.exe -burn.filehandle.attached=728 -burn.filehandle.self=740'
使用正则表达式 (.*)2023-07-17(.*): 搜索并替换为两个空格后,结果不符合预期:
- 预期结果1:
Burn v3.14.0.4118, Windows v10.0 (Build 22631: Service Pack 0), path: C:\Users\david\AppData\Local\Temp\{95942D14-E274-486C-A7FB-EDAF9E773422}\.cr\winsdksetup.exe
实际得到:
C:\Users\david\AppData\Local\Temp\{95942D14-E274-486C-A7FB-EDAF9E773422}\.cr\winsdksetup.exe
- 预期结果2:
Command Line: '-burn.clean.room=E:\Downloads\winsdksetup.exe -burn.filehandle.attached=728 -burn.filehandle.self=740'
实际得到:
'-burn.clean.room=E:\Downloads\winsdksetup.exe -burn.filehandle.attached=728 -burn.filehandle.self=740'
原因分析
正则表达式中的 .* 是贪婪匹配模式,它会尽可能匹配最长的符合规则的字符串。在你的正则 (.*)2023-07-17(.*): 里:
- 第一个
.*会匹配从行首到2023-07-17之前的所有内容(这部分没问题); - 第二个
.*会从2023-07-17之后开始,一直匹配到该行最后一个:的位置,而不是第一个。这就导致替换后,第一个:到最后一个:之间的内容都被删掉了,只留下最后一个:之后的部分。
解决方案
将贪婪匹配改为非贪婪匹配,把正则里的 .* 替换成 .*?。修改后的正则为:
(.*)2023-07-17(.*?):
非贪婪模式下,.*? 会匹配到第一个: 就停止,这样就能保留第一个: 之后的所有内容,符合你的预期结果。
内容的提问来源于stack exchange,提问作者DavidCF
相关产品推荐
相关产品推荐

