当前位置:  开发笔记 > 编程语言 > 正文

如何处理Perl正则表达式中的特殊字符?

如何解决《如何处理Perl正则表达式中的特殊字符?》经验,为你挑选了3个好方法。

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

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

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

但是,数组中的两个字符串是$450(Buy now).这些问题是字符串中的符号表示Perl正则表达式中的字符串结尾和捕获组,因此文本不会像我想要的那样解析.

有没有解决的办法?



1> Chris Lutz..:

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


@BenBlank:你在说什么?`\ Q`*编译成*`quotemeta`.它们是相同的功能.类似地,`\ L`编译成`lc`,`\ U`编译成`uc`等等.`\Q`"完全防止"反斜杠转义字符,因为**毕竟是'\ Q`!**

2> ysth..:

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> Julien Ronca..:

使用quotemeta:

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

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有