【问题标题】:How do I handle special characters in a Perl regex?如何处理 Perl 正则表达式中的特殊字符?
【发布时间】:2009-02-23 03:20:38
【问题描述】:

我正在使用 Perl 程序从文件中提取文本。我有一个字符串数组,用作文本的分隔符,例如:

$pat = $arr[1] . '(.*?)' . $arr[2];

if ( $src =~ /$pat/ ) {
   print $1;
}

但是,数组中的两个字符串是$450(Buy now)。这些问题是字符串中的符号代表 Perl 正则表达式中的字符串结尾和捕获组,因此文本不会按我的意图解析。

有没有办法解决这个问题?

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    试试 Perl 的quotemeta 函数。或者,在您的正则表达式中使用\Q\E 来关闭正则表达式中值的插值。有关\Q\E 的更多信息,请参阅perlretut - 它们可能不是您想要的。

    【讨论】:

    • 具体来说,\Q 不会防止反斜杠转义字符。 quotemeta 是迄今为止更通用的解决方案。
    • @BenBlank:你在说什么? \Q 编译成 quotemeta。它们是相同的功能。同样,\L 编译为 lc\U 编译为 uc 等。\Q“防止”反斜杠转义字符非常好,因为 毕竟是 \Q
    【解决方案2】:

    quotemeta 转义元字符,因此它们被解释为文字。作为快捷方式,您可以在双引号上下文中使用 \Q...\E 来包围应该被引用的内容:

    $pat = quotemeta($arr[1]).'(.*?)'.quotemeta($arr[2]);
    if($src=~$pat) { print $1 }
    

    $pat = "\Q$arr[1]\E(.*?)\Q$arr[2]";  # \E not necessary at the end
    if($src=~$pat) { print $1 }
    

    或者只是

    if ( $src =~ /\Q$arr[1]\E(.*?)\Q$arr[2]/ ) { print $1 }
    

    请注意,这不仅限于插值变量;文字字符也会受到影响:

    perl -wle'print "\Q.+?"'
    \.\+\?
    

    虽然很明显它发生在变量插值之后,所以 "\Q$foo" 不会变成 '\$foo'。

    【讨论】:

      【解决方案3】:

      使用quotemeta:

      $pat = quotemeta($arr[1]) . '(.*?)' . quotemeta($arr[2]);
      if ($src =~ $pat) 
          print $1;
      

      【讨论】:

        猜你喜欢
        • 2010-10-19
        • 1970-01-01
        • 1970-01-01
        • 2021-09-16
        相关资源
        最近更新 更多