Notepad++正则表达式替换-\1无法工作?

16

首先声明一下,我看过很多关于这个问题的提问,但是我没有找到答案(至少在我的搜索中没有)。如果我错过了,请指出来!

我知道如何使用正则表达式,事实上我正在查找我要搜索的文本。但是,当我尝试像其他问题建议的那样使用"\1MyAppendedTextHere"进行替换时,它只会删除匹配的模式并添加跟在\1后面的内容。(我查找的以前的问题说明"\1"就是notepad++这样做的方法)。这个有变化吗?我做错了什么吗?

以下是它的样子:

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

非常感谢你的帮助!


2
就我所知,在v6.6.8中,捕获的内容由$0、$1等表示。其他留言中也提到了$符号。另一方面,下面提到的反斜杠符号对我来说没有起作用,除了在输出时转义括号。 - bvj
1个回答

25

\1 引用了正则表达式中第一个捕获组的内容,也就是你搜索的正则表达式中第一组括号内的内容。但是在你的正则表达式中没有这样的括号,因此 \1 没有可以引用的内容。

如果你想引用整个匹配的内容,可以使用 \0,或者在正则表达式中加上相关部分的括号。

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

nameABC更改为nameABC_SUFFIX

使用捕获组,您可以做一些类似的事情

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

这将用ABC_SUFFIX替换nameABC


2
另外,由于Notepad++使用PCRE正则表达式引擎,您应该避免使用\1并适应使用$1(请参见https://dev59.com/oXNA5IYBdhLWcg3wKacx)。 - psxls
@psxls:你确定吗?Perl不是PCRE(“Perl兼容的正则表达式”,一种不同的引擎)。 - Tim Pietzcker
@Tim,感谢您的评论,因为它让我思考,我认为我可能是错的。我知道PCRE和Perl正则表达式引擎之间的区别,但我天真地认为,由于PCRE模仿了Perl的语法和语义,同样的警告适用。我查看了PCRE的手册页,没有找到任何关于这个问题的参考,而perlre的解释给出了两个例子,说明为什么应该避免使用\1,但这并不适用于Notepad++的情况。 - psxls
另一方面,使用PCRE的PHP 声明 $1 表单是首选:替换可以包含形式为 \n 或(自PHP 4.0.4以来)$n 的引用,后者是首选形式。 我想这很有道理,因为 /e 修饰符可能会导致与Perl中相同的问题。 - psxls
谢谢您的帮助。我用这个方法添加了前缀。我在文件中搜索日期,格式为<名称>-<日期>,并且想将其转换为CSV格式以便导入到某些网站。我在Notepad++中的搜索方式是:查找:-([0-9][0-9][0-9][0-9]),替换为:,$1。非常感谢,这节省了我大量的时间! - Brian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接