perlの正規表現について質問させてください。


「AAAhogeAAAhogeAAAhogeAAAhogeBBB」
から
最後の「AAAhogeBBB」を抜き出したいのです。

「AAAhoge」は複数回繰り返される可能性があります。

量指定子最短マッチとして"+?"があると思いますが、
これは前方から一致させていくので、
この逆のような働きをするような正規表現の記述の方法はありますでしょうか。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/06/24 14:20:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答5件)

id:Craftworks No.1

回答回数20ベストアンサー獲得回数6

ポイント20pt
$str = 'AAAhogeAAAhogeAAAhogeAAAhogeBBB';
if ( $str =~ /(AAAhogeBBB)$/ ) {
    print "match";
}
else {
    print "not match";
}

こういうことですか?

id:the_yakisoba

「hoge」に何が入るかは不明とお考えください。

よろしくお願いします。

2009/06/17 15:46:42
id:masahikokimoto No.2

回答回数241ベストアンサー獲得回数10

ポイント20pt

うーんとどこが可変なんかがよくわかりませんが、$が文字列末尾にマッチしますので、

/.+(AAAhogeBBB)$/

こんな感じのことをやりたいのでしょうか。

id:the_yakisoba

説明不足で申し訳ないです。

「AAA***AAA***AAA***BBB」という文字列に対して、

最後の「AAA***BBB」のみを一致させたいです。

「***」に何が入るかは不明です。

現状は下記のようにしています。

(reverse 'AAA***AAA***AAA***BBB') =~ /(BBB.+?AAA)/;

2009/06/17 16:56:27
id:b-wind No.3

回答回数3344ベストアンサー獲得回数440

ポイント20pt

正攻法(先読みを使う)

my $str = 'AAAhogeAAAhogeAAAhogeAAAhogeBBB';
my $match = 'unmatch';
$match = $1 if $str =~ /((AAA)(?!.*AAA)(.+?)(BBB))/;
print "$match\n";
id:masahikokimoto No.4

回答回数241ベストアンサー獲得回数10

ポイント20pt

ということなら、

$str = "AAAhogeAAAhugeAAApugeBBB";

$str =~ /(AAA[^A]+)+(AAA.+BBB)$/;

print "$2\n";

こんな感じですか?

id:pyopyopyo No.5

回答回数377ベストアンサー獲得回数98

ポイント20pt

/AAA[^(AAA)]*BBB$/ ですかね。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません