0

与えられた変数:

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

私の入力文字列はfishin_oceanまたはfishout_oceanのいずれかです。

$var1正規表現の一部がとにある入力文字列の両方に一致するように Perl 正規表現を作成するにはどうすればよい$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
    }
}

perldocperlretutおよびperldocperlreの詳細

于 2012-06-13T00:54:01.817 に答える
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 に答える
0

これは機能するはずです:

/fish(in|out)_ocean/
于 2012-06-13T00:48:06.583 に答える
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 に答える