Notepad++ 正则表达式替换 - \1 不起作用?

Posted

技术标签:

【中文标题】Notepad++ 正则表达式替换 - \\1 不起作用?【英文标题】:Notepad++ Regex replace - \1 doesn't work?Notepad++ 正则表达式替换 - \1 不起作用? 【发布时间】:2013-11-03 17:22:21 【问题描述】:

作为序言,我已经阅读了很多关于此的问题,但我找不到答案(至少在我的挖掘中)。如果我确实错过了,请随时指出!

我知道如何使用正则表达式,事实上我正在寻找我正在搜索的文本。但是,当我尝试按照其他问题建议的"\1MyAppendedTextHere" 进行替换时,它只会删除匹配的模式并添加\1 后面的内容。 (我查找的先前问题指出"\1" 是notepad++ 是如何做到这一点的)。这有改变吗?我做错了吗?

这是它的样子:

find: name[A-Z_0-9]+
replace: \1_SUFFIX

感谢任何帮助!

【问题讨论】:

FWIW,我注意到在 v6.6.8 中,捕获由 $0、$1 等表示。下面的其他 cmets 也提到了 $ 表示法。另一方面,下面提到的反斜杠符号对我不起作用,除了转义输出括号。 【参考方案1】:

\1 引用了第一个capturing group 的内容,这意味着您的搜索正则表达式中的第一组括号。您的正则表达式中没有一个,因此 \1 没有可参考的内容。

如果您想引用整个匹配项,请使用\0,或者在正则表达式的相关部分周围添加括号。

find: name[A-Z_0-9]+
replace: \0_SUFFIX

会将nameABC 更改为nameABC_SUFFIX

使用捕获组,您可以执行以下操作

find: name([A-Z_0-9]+)     
replace: \1_SUFFIX

这会将nameABC 替换为ABC_SUFFIX

【讨论】:

另外,由于Notepad++使用的是PCRE正则表达式引擎,所以要避免使用\1,习惯$1(见***.com/q/1068840/2140859) @psxls:你确定吗? Perl 不是 PCRE(“Perl 兼容的正则表达式”,一个不同的引擎)。 @Tim,感谢您的评论,因为它让我思考,我相信我可能是错的。我知道 PCRE 和 Perl 正则表达式引擎之间的区别,但我天真地假设由于 PCRE 模仿 Perl 的语法和语义,所以同样的警告适用。我检查了PCRE's man page 并没有发现任何关于这个问题的参考,而perlre 的解释给出了两个为什么你应该避免\1 的例子不适用于记事本++ 案例。 另一方面,使用 PCRE states 的 php 首选 $1 形式:替换可能包含 \\n 或(自 PHP 4.0.4 起)$ 形式的引用n, 后一种形式是首选的 on。我想这是有道理的,因为 /e 修饰符可能会导致与 Perl 中相同的问题。 谢谢。我用它来附加前缀。我正在使用 - 在文件中搜索日期,我想将其制作成 CSV 以导入某些站点。我在 Notepad++ 中的搜索是: Find: -([0-9][0-9][0-9][0-9]) Repace: ,$1 谢谢这为我节省了大量时间!

以上是关于Notepad++ 正则表达式替换 - \1 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

notepad正则怎么替换其中一部分

如何在 Notepad++ 正则表达式查找/替换中保留括号

删除 Notepad++ 中的空行

在 Notepad++ 中用 \t 替换正则表达式

Notepad++的正则表达式替换和替换

notepad++ 正则表达式(记录)