如何将正则表达式分组到第9个反向引用之后?

时间:2012-06-06 02:26:10

标签: regex notepad++ regex-group

好的,所以我试图在记事本++中超越第9个反向引用。维基说我可以使用组命名来超过第9个引用。但是,我似乎无法正确地进行匹配。我开始只用两组来简化它。

示例数据

1000,1000

正则表达式。

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

根据docs,我需要做以下事情。

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

然而,结果是找不到我的文字。有什么建议吗?

4 个答案:

答案 0 :(得分:32)

您可以简单地引用群组&gt;以与那些相同的方式使用图9中所示的方法。 10

,即10美元是第十组。

对于(天真的)例子:

字符串:

  

ABCDEFGHIJKLMNOPQRSTUVWXYZ

正则表达式发现:

  

(?: A)(B)(C)(d)(E)(F)(G)(H)(I)(J)(K)(L)(M)(N)(O) (p)的

替换:

  

10 $

结果:

  

kqrstuvwxyz

我的测试是在Notepad ++ v6.1.2中进行的,并给出了我期望的结果。

更新:这仍然适用于v7.5.6


SarcasticSully复活了这个问题:

  

“如果你想用第一组替换后跟字符'0'怎么办?”

要执行此操作,请将替换更改为:

  

$ 1 \ X30

替换为第1组和十六进制字符30 - 在ascii中为0

答案 1 :(得分:3)

一个非常迟来的答案,可以帮助那些从Google登陆的人(就像我一样)。在notepad ++替换中命名的反向引用如下所示:$+{name}。无论出于何种原因。

这里有一个偏离标准正则表达式的方法,但是......命名的反向引用也给出了数字。在标准正则表达式中,如果您有(.*)(?<name> & )(.*),则可以使用$1${name}$2替换以获得与您开始时完全相同的行。在notepad ++中,您必须使用$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


我的搜索RegEx:

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

我的替代RegEx:

  $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

希望这有助于某人。

答案 2 :(得分:1)

好的,匹配没问题,你的例子在我当前的Notepad ++中匹配。这是一个重点。 要在Notepad ++中使用PCRE正则表达式,您需要版本&gt; = 6.0

另一点是,你想在哪里使用反向引用?我可以在正则表达式中使用名为backreferences而不会出现,但在替换字符串中则不会。

装置

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

将匹配

1000,1001,1000

但我不知道使用命名组或组的方法&gt; 9替换字符串。

替换字符串中是否真的需要9个以上的反向引用?如果您只需要9个以上的小组,但不是所有小组都在替换中,那么通过添加?:来创建您不需要重用非捕获组的组小组的开始。

(?:[0-9]*),([0-9]*),(?:[0-9]*),([0-9]*)
           group 1             group 2

答案 3 :(得分:1)

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

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