【问题标题】: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 也提到了 $ 表示法。另一方面,下面提到的反斜杠符号对我不起作用,除了转义输出括号。

标签: regex replace notepad++


【解决方案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(见stackoverflow.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 谢谢这为我节省了大量时间!
猜你喜欢
  • 2011-04-03
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
  • 2016-03-09
  • 1970-01-01
  • 2012-01-25
相关资源
最近更新 更多