我正在使用Perl程序从文件中提取文本.我有一个字符串数组,我用它作为文本的分隔符,例如:
$pat = $arr[1] . '(.*?)' . $arr[2]; if ( $src =~ /$pat/ ) { print $1; }
但是,数组中的两个字符串是$450
和(Buy now)
.这些问题是字符串中的符号表示Perl正则表达式中的字符串结尾和捕获组,因此文本不会像我想要的那样解析.
有没有解决的办法?
试试Perl的quotemeta功能.或者,在正则表达式中使用\Q
和\E
关闭正则表达式中值的插值.有关更多信息,请参阅perlretut - 它们可能不是您正在寻找的.\Q
\E
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'.
使用quotemeta:
$pat = quotemeta($arr[1]) . '(.*?)' . quotemeta($arr[2]); if ($src =~ $pat) print $1;