0

给定变量:

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

我的输入字符串可以是fishin_oceanfishout_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

4 回答 4

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中的更多信息

于 2012-06-13T00:54:01.817 回答
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
于 2012-06-13T15:18:34.953 回答
0

这应该有效:

/fish(in|out)_ocean/
于 2012-06-13T00:48:06.583 回答
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
于 2012-06-13T06:50:57.807 回答