从变量中的值构建的Perl正则表达式

时间:2012-06-13 00:39:28

标签: regex perl pattern-matching

给出变量:

my $var1 = "fish";
my $var2 = "ocean";

我的输入字符串可以是 fishin_ocean fishout_ocean

如何编写Perl正则表达式以匹配输入字符串,其中正则表达式的部分位于$var1$var2?这个(字符串在$var3中)不会返回上述任何一个字符串:

  $var3 =~ /$var1.+?$var2/;

根据OP的回答编辑:

我认为最终导致问题的是特殊的方形牌

    my $a = "slash_wideiscan"; my $b = "_mnn3h_reg[0]";
    my @array1 = qw (slash_wideiscanps_mnn3h_reg[0] 
                     slash_wideiscanptlr_mnn3h_reg[0] 
                     slash_wideiscanps_mnn0h_reg);
    for my $element (@array1) {
        if ($element =~ /($a.+?$b)/) {
            print "YES : $element\n";
        } else {
            print "NO : $element\n";
        }
    }

回来的答案是

    NO : slash_wideiscanps_mnn3h_reg[0]
    NO : slash_wideiscanptlr_mnn3h_reg[0]
    NO : slash_wideiscanps_mnn0h_reg

我其实想要

    YES : slash_wideiscanps_mnn3h_reg[0]
    YES : slash_wideiscanptlr_mnn3h_reg[0]
    NO : slash_wideiscanps_mnn0h_reg

4 个答案:

答案 0 :(得分:1)

不太清楚你在寻找什么,但这是你的正则表达式:

my $fish  = "fish";
my $ocean = "ocean";

for my $word ("fishin_ocean", "fishout_ocean") {
    if ($word =~ /($fish.+?$ocean)/) {  # parens capture to $1
         print "Word $word matches\n";
         print "The matching part is: $1\n";  # $1 contains the captured text
    }
}

perldoc perlretutperldoc perlre

中的更多信息

答案 1 :(得分:0)

这应该有效:

/fish(in|out)_ocean/

答案 2 :(得分:0)

你的正则表达式很好。问题是你认为正则表达式返回匹配的字符串,但实际上,它只返回true或false(如果它匹配或不匹配)。

如果要捕捉匹配项,请在要捕获的部分周围使用括号。捕获按顺序存储在1美元,2美元,3美元等......

my ($var1, $var2, $var3) = ("fish", "ocean", "fishin_ocean")

$var3 =~ /($var1)(.+?$var2)/;    # only returns true or false
print $1;                        # prints fish
print $2;                        # prints in_ocean

答案 3 :(得分:0)

根据您的回答(必须是对您的问题的更新),请使用\Q\E来逃避正则表达式的每个部分,如下所示:

my $a = "slash_wideiscan"; 
my $b = "_mnn3h_reg[0]";
my @array1 = qw (slash_wideiscanps_mnn3h_reg[0] 
                 slash_wideiscanptlr_mnn3h_reg[0] 
                 slash_wideiscanps_mnn0h_reg);
for my $element (@array1) {
    if ($element =~ /(\Q$a\E.+?\Q$b\E)/) {
               here___^   ^    ^   ^
        print "YES : $element\n";
    } else {
        print "NO : $element\n";
    }
}

<强>输出:

YES : slash_wideiscanps_mnn3h_reg[0]
YES : slash_wideiscanptlr_mnn3h_reg[0]
NO : slash_wideiscanps_mnn0h_reg