「AAAhogeAAAhogeAAAhogeAAAhogeBBB」
から
最後の「AAAhogeBBB」を抜き出したいのです。
「AAAhoge」は複数回繰り返される可能性があります。
量指定子最短マッチとして"+?"があると思いますが、
これは前方から一致させていくので、
この逆のような働きをするような正規表現の記述の方法はありますでしょうか。
$str = 'AAAhogeAAAhogeAAAhogeAAAhogeBBB'; if ( $str =~ /(AAAhogeBBB)$/ ) { print "match"; } else { print "not match"; }
こういうことですか?
うーんとどこが可変なんかがよくわかりませんが、$が文字列末尾にマッチしますので、
/.+(AAAhogeBBB)$/
こんな感じのことをやりたいのでしょうか。
説明不足で申し訳ないです。
「AAA***AAA***AAA***BBB」という文字列に対して、
最後の「AAA***BBB」のみを一致させたいです。
「***」に何が入るかは不明です。
現状は下記のようにしています。
(reverse 'AAA***AAA***AAA***BBB') =~ /(BBB.+?AAA)/;
正攻法(先読みを使う)
my $str = 'AAAhogeAAAhogeAAAhogeAAAhogeBBB'; my $match = 'unmatch'; $match = $1 if $str =~ /((AAA)(?!.*AAA)(.+?)(BBB))/; print "$match\n";
ということなら、
$str = "AAAhogeAAAhugeAAApugeBBB";
$str =~ /(AAA[^A]+)+(AAA.+BBB)$/;
print "$2\n";
こんな感じですか?
「hoge」に何が入るかは不明とお考えください。
よろしくお願いします。