代码之家  ›  专栏  ›  技术社区  ›  Andreas Grech

perl中使用单个正则表达式的多个替换

  •  1
  • Andreas Grech  · 技术社区  · 15 年前

    my $string;
    $string =~ s/ /\\ /g;
    $string =~ s/'/\\'/g;
    $string =~ s/`/\\`/g;
    

    上面的替换可以用一个组合的正则表达式而不是三个单独的正则表达式来执行吗?

    3 回复  |  直到 15 年前
        1
  •  9
  •   mikej heading_to_tahiti    15 年前
    $string =~ s/([ '`])/\\$1/g;
    

    使用 character class [ '`] 匹配空格、'或',并使用括号 () 记住匹配的字符。 $1

        2
  •  4
  •   Eugene Yarmash    15 年前

    单独替换可能比单个复杂替换更有效(例如,在使用固定替换时)。在这种情况下,您可以缩短代码,如下所示:

    my $string;    
    for ($string) {
        s/ /\\ /g;
        s/'/\\'/g;
        s/`/\\`/g;
    }
    
        3
  •  2
  •   Ether    15 年前

    尽管现在的阅读方式可能更容易理解,但您可以通过使用循环或将它们组合到一个表达式中,一次执行这些替换:

    # loop
    $string =~ s/$_/\\$_/g foreach (' ', "'", '`');
    
    # combined
    $string =~ s/([ '`])/\\$1/g;
    

    顺便说一下,您可以通过避免“倾斜牙签综合症”使替换更易于阅读,因为各种regex操作符允许您使用各种分隔符:

    $string =~ s{ }{\\ }g;
    $string =~ s{'}{\\'}g;
    $string =~ s{`}{\\`}g;