$var = 1.2.3 または $var = Variable/1.2.3 のような変数があります。$1 に一致して格納する正規表現を作成しようとしています。コードは次のようになります。
if ($var =~ m/[\w+\/\d+.\d+.\d+])/){
$a = $1;
}
$var のいずれかが優先される場合、上記の条件で一致させたいと考えています。私に提案してください。ありがとうございました。
括弧はキャプチャします。に依存するとエラーが発生しやすくなります。単純に、 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 <<<
その文字クラスを削除する必要があります。文字クラスは 1 文字だけに一致します。シーケンスを表すものではありません。また、.
正規表現のメタ文字です。文字どおり一致させるには、エスケープする必要があります。
そして、必ずしも文字列に存在するとは限らないため、量指定子/
を使用して前の部分をオプションとして作成する必要があります。?
if ($var =~ m/((?:\w+\/)?\d+\.\d+\.\d+)/){
$a = $1;
}
参考までに、エスケープを避けるために、一致演算子に任意の区切り文字を使用できます/
。
m!((?:\w+/)?\d+\.\d+\.\d+)!
これを試して:
if ($var =~ m/(?>[a-z_][a-z0-9_]*+\/)?+[0-9]++\.[0-9]++\.[0-9]++/i) {
$a = $&;
}