regex 如何对超过第9个反向引用的正则表达式进行分组?

gywdnpxw  于 2023-03-20  发布在  其他
关注(0)|答案(4)|浏览(145)

好的,我尝试在notepad++中分组超过第9个反向引用。wiki说我可以使用分组命名来超过第9个引用。然而,我似乎不能正确地获得语法来进行匹配。我开始只使用两个分组来简化它。

示例数据

1000,1000

正则表达式

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

根据文件,我需要做以下工作。

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

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

tez616oj

tez616oj1#

您可以使用与引用〈10的组相同的方式引用〉9的组
即$10是第十组。
举个(幼稚的)例子:
字符串:
阿布茨夫吉伊克尔姆诺普克尔斯图夫克斯
正则表达式查找:
(?:a)(B)(c)(d)(e)(f)(g)(h)(i)(j)(k)(l)(m)(n)(o)(p)
替换:
十元
结果:
克尔克斯图夫克斯
我的测试是在Notepad++ v6.1.2中执行的,并给出了我预期的结果。
更新:从v7.5.6起仍然有效
讽刺萨利重提这个问题:
“如果要替换为第一组,后跟字符”0“,该怎么办?”
为此,请将替换更改为:
1元
替换为组1和十六进制字符30(ASCII中的0)。

dgsult0t

dgsult0t2#

这是一个非常迟的回答,可以帮助其他从Google登陆到这里的人(就像我一样)。记事本替换中的命名反向引用看起来像这样:$+{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

我的搜索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

希望这能帮到什么人。

2ul0zpep

2ul0zpep3#

好的,匹配没有问题,你的例子在当前的记事本中为我匹配。这是很重要的一点。**要在记事本中使用PCRE正则表达式,你需要一个版本〉= 6.0**。
另一点是,你想在哪里使用反向引用?我可以在正则表达式**中使用命名反向引用,而不是在替换字符串中。
手段

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

将匹配

1000,1001,1000

但是我不知道如何在替换字符串中使用命名组或〉9的组。
替换字符串中是否确实需要9个以上的反向引用?如果只需要9个以上的组,而不是替换中的所有组,则通过在组的开头添加?:,使组不需要重用非捕获组

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

vcirk6k64#

使用\x引用组的常见语法将\10解释为对组1的引用,后跟0。
您需要使用$x和$10的替代语法。
这里的问题是针对Notepad++的,但是如果您必须在Bash中执行此操作,请不要忘记将表达式转义为$10

  • 注意:有些人似乎怀疑是否有理由拥有10个组。**我有一个简单的组,我想将名为的文件组重命名为

<name_start>* 年月日_时间_年月日_时间 <name_end>替换为<name_start> 年年月日_时间_年年月日_时间 <name_end>,
最后将我输入的匹配替换为:
将“\1”重命名为“\2\5\4\3_\6_\9\8\7_$10”,因为名称开始和名称结束并不总是恒定的。

相关问题