Perl正则表达式匹配包含特殊字符的字符串

5
我有一组子字符串,需要在一组URL字符串中进行匹配。这些子字符串包含特殊字符例如 '|'、'*'、'-'、'+'等。如果URL字符串中包含该子字符串,则需要执行某些操作。但现在让我们简单地在控制台中打印出"TRUE"。
我首先从子字符串列表中读取数据并将其放入散列表中。然后,我尝试对每个URL进行一个简单的正则表达式匹配,直到找到匹配项为止。代码大致如下。
open my $ADS, '<', $ad_file or die "can't open $ad_file";

while(<$ADS>) {
        chomp;

        $ads_list_hash{$lines} = $_;
        $lines ++;
 }  

close $ADS;

open my $IN, '<', $inputfile or die "can't open $inputfile";      
my $first_line = <$IN>;

while(<$IN>) {      
       chomp;       

       my @hhfile = split /,/;       
       for my $count (0 .. $lines) {

            if($hhfile[9] =~ /$ads_list_hash{$count}/) {
                print "$hhfile[9]\t$ads_list_hash{$count}\n";

                print "TRUE !\n";
                last;
            }
       }

 }

 close $IN;

问题在于子字符串中包含很多特殊字符,导致匹配过程中出现错误:$hhfile[9] =~ /$ads_list_hash{$count}/。以下是一些示例:

+adverts/
.to/ad.php|
/addyn|*|adtech;

在像这样的行中,我会遇到一个错误,基本上说“量词后面没有正则表达式”。我需要改变正则表达式匹配语法中的某些内容来避免这种情况吗?


1
如果你只是想找到一个子字符串,那么正则表达式似乎有点过度杀伤了... index 为什么不能满足你的需求呢? - jswolf19
可能是 如何在 Perl 正则表达式中处理特殊字符? 的重复问题。 - daxim
1个回答

14

你需要转义字符串中的特殊字符。

\Q\E将字符串括起来就可以完成这个任务:

if($hhfile[9] =~ /\Q$ads_list_hash{$count}\E/) {

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接