-1

$var = 1.2.3 または $var = Variable/1.2.3 のような変数があります。$1 に一致して格納する正規表現を作成しようとしています。コードは次のようになります。

 if ($var =~ m/[\w+\/\d+.\d+.\d+])/){
     $a = $1;
 }

$var のいずれかが優先される場合、上記の条件で一致させたいと考えています。私に提案してください。ありがとうございました。

4

3 に答える 3

2

括弧はキャプチャします。に依存するとエラーが発生しやすくなります。単純に、 atch 演算子$1からの戻り値を使用してください。m

for my $var ('1.2.3', 'Variable/1.2.3') {
    if (my ($version) = $var =~ m{
        (?:\A | /)            # beginning of string or a slash
        (\d+ [.] \d+ [.] \d+) # capture version number triple
        \z                    # end of string
    }msx) {
        print ">>> $version <<<\n";
    }
}
__END__
>>> 1.2.3 <<<
>>> 1.2.3 <<<
于 2013-08-30T19:36:12.943 に答える
1

その文字クラスを削除する必要があります。文字クラスは 1 文字だけに一致します。シーケンスを表すものではありません。また、.正規表現のメタ文字です。文字どおり一致させるには、エスケープする必要があります。

そして、必ずしも文字列に存在するとは限らないため、量指定子/を使用して前の部分をオプションとして作成する必要があります。?

if ($var =~ m/((?:\w+\/)?\d+\.\d+\.\d+)/){
    $a = $1;
}

参考までに、エスケープを避けるために、一致演算子に任意の区切り文字を使用できます/

m!((?:\w+/)?\d+\.\d+\.\d+)!
于 2013-08-30T19:34:22.747 に答える
-1

これを試して:

if ($var =~ m/(?>[a-z_][a-z0-9_]*+\/)?+[0-9]++\.[0-9]++\.[0-9]++/i) {
     $a = $&;
 }
于 2013-08-30T19:44:39.113 に答える