regex - Perl 正则表达式将 {a, b, c, ..., x} 转换为 (a|b|c|...|x)

标签 regex perl wildcard

我正在学习 Perl 并练习正则表达式,我想拥有以下功能:

输入

通配符样式的 shell 语法

输出

Perl 正则表达式

我很清楚 Regexp::Wildcards 但我想要更小的东西,我也想自己编写它以用于教育目的。

我真的很难为此编写正则表达式。我试图列出我的要求,以帮助使正则表达式模式显现出来:

  • 从 {
  • 开始匹配
  • 保留对每个逗号分隔元素的反向引用,去掉填充空格
  • 在 }
  • 处结束匹配

    然而,这只是在我的脑海中引入了更多的问题
  • 如何保持对任意长列表的反向引用?

  • 例子

    假设输入是 {foo, bar}.c .替代运算符应将其转换为 (foo|bar).c .

    最佳答案

    您没有保留反向引用的动态列表。

    相反,您将这个问题分解为几个步骤:

    my $string = "{a, b, c, d, ..., x}";
    
    if ($string =~ m/\{(.*?)\}/) {
        my $str = join '|', split /,\s*/, $1;
        print "($str)";
    }
    

    输出:
    (a|b|c|d|...|x)
    

    也可以使用双层搜索和替换来做到这一点,如下所示:
    $string =~ s{\{(.*?)\}}{
        my $list = $1;
        $list =~ s/,\s*/|/g;
        "($list)"
    }eg;
    
    print $string;
    

    关于regex - Perl 正则表达式将 {a, b, c, ..., x} 转换为 (a|b|c|...|x),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25006111/

    相关文章:

    c# - 正则表达式替换 : how to get length of the match dynamically in replacement

    perl - 如何将 Perl 匹配运算符中的匹配项提取到变量中?

    Perl 程序在运行 `$exec` 语句后生成其自身程序的多个副本

    git - 在 git log 中使用路径通配符

    php - 在 codeigniter 路由中使用通配符?

    java - Android正则表达式分割成字符串数组

    ios - 正则表达式坏了(或者我是)?

    java - 正则表达式在 Java 中未按预期工作

    perl - 无法使用 Net::OpenSSH 进行 SSH,可以通过命令行

    mysql - 在 MySQL 中选择除一列之外的所有列?