Perl正则表达式匹配特殊字符

时间:2015-03-24 14:12:07

标签: regex perl

我有以下代码,我正在检查排除的数组中的特定变量位置。除了一个之外的所有数组元素都可以正常工作(abc / def / libraries / linux_3.2.60-1 + deb7u3.dsc) 。当我提供这个元素作为我的位置时,它的打印“位置不被排除”,即使它被排除在外。

如何让我的代码获取此元素以及排除?

use strict;
use warnings;

my @excluded = (
 "xyz/efg/headers/",
 "abc/def/libraries/jni-mr.h",
 "abc/def/libraries/linux_3.2.60-1+deb7u3.dsc", 
);

my $location = "abc/def/libraries/linux_3.2.60-1+deb7u3.dsc";
my $badpath = 0;

foreach (@excluded) {
    # -- Check if location is contained in excluded array
    if ($location =~ /^$_/) {
       $badpath = 1;
       print "location is excluded : $location \n";
     }
   }

   if (! $badpath) {
      print "location is not excluded : $location \n";  
     }

期望的输出:

location is excluded : abc/def/libraries/linux_3.2.60-1+deb7u3.dsc

当前输出:

location is not excluded : abc/def/libraries/linux_3.2.60-1+deb7u3.dsc

2 个答案:

答案 0 :(得分:2)

使用quotemeta($text)\Q$text\E(在双引号内或正则表达式文字中)创建与$text的值匹配的模式。换句话说,使用

if ($location =~ /^\Q$_\E/)

而不是:

if ($location =~ /^$_/)

答案 1 :(得分:0)

  • 看起来您打算通过正则表达式定义排除项,但是您还没有在这些正则表达式中正确转义正则表达式元数据。对于你的失败案例,导致它失败的元模型是加号(+),这是大多数正则表达式(包括Perl)中的一个或多个乘数,但你需要按字面意思匹配它。

  • 此外,我建议将^锚从循环移动到每个单独的正则表达式,这将使代码更灵活,因为您可以选择不锚定某些排除如果你想要正则表达式。

  • 此外,您应该使用qr()构造,它允许您预编译正则表达式,节省CPU。

  • 此外,此要求适合使用grep()


use strict;
use warnings;

my @excluded = (
    qr(^xyz/efg/headers/),
    qr(^abc/def/libraries/jni-mr\.h),
    qr(^abc/def/libraries/linux_3\.2\.60-1\+deb7u3\.dsc),
);

my $location = 'abc/def/libraries/linux_3.2.60-1+deb7u3.dsc';

# -- Check if location is contained in excluded array
my $badpath = scalar(grep($location =~ $_, @excluded )) >= 1 ? 1 : 0;
if ($badpath) {
    print "location is excluded : $location \n";
} else {
    print "location is not excluded : $location \n";
}