38

好的,所以我试图在记事本 ++ 中对第 9 个反向引用进行分组。wiki 说我可以使用组命名来超越第 9 个参考。但是,我似乎无法正确使用语法来进行匹配。为了简单起见,我只从两组开始。

样本数据

1000,1000

正则表达式。

(?'a'[0-9]*),([0-9]*)

根据文档,我需要执行以下操作。

(?<some name>...), (?'some name'...),(?(some name)...)
Names this group some name.

但是,结果是它找不到我的文本。有什么建议么?

4

4 回答 4

38

You can simply reference groups > 9 in the same way as those < 10

i.e $10 is the tenth group.

For (naive) example:

String:

abcdefghijklmnopqrstuvwxyz

Regex find:

(?:a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)(n)(o)(p)

Replace:

$10

Result:

kqrstuvwxyz

My test was performed in Notepad++ v6.1.2 and gave the result I expected.

Update: This still works as of v7.5.6


SarcasticSully resurrected this to ask the question:

"What if you want to replace with the 1st group followed by the character '0'?"

To do this change the replace to:

$1\x30

Which is replacing with group 1 and the hex character 30 - which is a 0 in ascii.

于 2012-06-06T14:15:12.340 回答
4

一个很晚的答案来帮助从谷歌登陆这里的其他人(就像我一样)。notepad++ 替换中的命名反向引用如下所示 $+{name}:不管什么原因。

这里与标准的正则表达式存在偏差,尽管......命名的反向引用也给出了数字。在标准正则表达式中,如果您有(.*)(?<name> & )(.*),您将替换为$1${name}$2以获得与您开始时完全相同的行。在记事本++中,您必须使用$1$+{name}$3.


示例: 我需要为不匹配的配置清理 Visual Studio .sln 文件。我需要替换的文本如下所示:

    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|Any CPU.Build.0 = Debug|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x64.ActiveCfg = Debug|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x64.Build.0 = Debug|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x86.ActiveCfg = Debug|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x86.Build.0 = Debug|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|Any CPU.ActiveCfg = Release|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|Any CPU.Build.0 = Release|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x64.ActiveCfg = Release|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x64.Build.0 = Release|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x86.ActiveCfg = Release|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x86.Build.0 = Release|Any CPU


我的搜索正则表达式:

  ^(\s*\{[^}]*\}\.)(?<config>[a-zA-Z0-9]+\|[a-zA-Z0-9 ]+)*(\..+=\s*)(.*)$

我的替代正则表达式:

  $1$+{config}$3$+{config}

结果:

    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|Any CPU.ActiveCfg = Dev|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|Any CPU.Build.0 = Dev|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x64.ActiveCfg = Dev|x64
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x64.Build.0 = Dev|x64
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x86.ActiveCfg = Dev|x86
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.Dev|x86.Build.0 = Dev|x86
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|Any CPU.ActiveCfg = QA|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|Any CPU.Build.0 = QA|Any CPU
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x64.ActiveCfg = QA|x64
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x64.Build.0 = QA|x64
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x86.ActiveCfg = QA|x86
    {CDDB12FE-885F-4FB7-9724-1A4279573DE5}.QA|x86.Build.0 = QA|x86

希望这可以帮助某人。

于 2016-06-03T19:38:54.517 回答
2

使用 \x 引用组的常用语法会将 \10 解释为对组 1 的引用,后跟 0。
您需要使用 $x 和 $10 的替代语法。

注意:有些人似乎怀疑有任何理由拥有 10 个组。
我有一个简单的,我想将一组名为
<name_start> DDMMYYYY_TIME_DDMMYYYY_TIME <name_end> 的文件重命名为 <name_start> YYYYMMDD_TIME_YYYYMMDD_TIME <name_end>,
并以替换我的输入匹配结束:
rename "\1" "\2\5 \4\3_\6_\9\8\7_$10" 因为 name_start 和 name_end 并不总是恒定的。

于 2020-11-02T08:11:57.050 回答
1

好的,匹配没问题,您的示例在当前的 Notepad++ 中与我匹配。这是很重要的一点。要在 Notepad++ 中使用 PCRE 正则表达式,您需要 Version >= 6.0

另一点是,你想在哪里使用反向引用?我可以在 regex中使用命名反向引用而不会出现问题,但在替换字符串中则不行。

方法

(?'a'[0-9]*),([0-9]*),\g{a}

将匹配

1000,1001,1000

但我不知道在替换字符串中使用命名组或组 > 9 的方法。

替换字符串中真的需要超过 9 个反向引用吗?如果您只需要超过 9 个组,但不是全部替换,则通过在组的开头添加 a来使不需要重用非捕获组的组。?:

(?:[0-9]*),([0-9]*),(?:[0-9]*),([0-9]*)
           group 1             group 2
于 2012-06-06T06:47:37.373 回答