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


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

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

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

回答の条件
  • 1人2回まで
  • 登録:2009/06/17 14:16:19
  • 終了:2009/06/24 14:20:03

回答(5件)

id:Craftworks No.1

Craftworks回答回数20ベストアンサー獲得回数62009/06/17 15:33:22

ポイント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

masahikokimoto回答回数241ベストアンサー獲得回数102009/06/17 15:45:45

ポイント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

b-wind回答回数3344ベストアンサー獲得回数4402009/06/17 21:03:59

ポイント20pt

正攻法(先読みを使う)

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

masahikokimoto回答回数241ベストアンサー獲得回数102009/06/17 17:04:50

ポイント20pt

ということなら、

$str = "AAAhogeAAAhugeAAApugeBBB";

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

print "$2\n";

こんな感じですか?

id:pyopyopyo No.5

pyopyopyo回答回数341ベストアンサー獲得回数832009/06/21 22:23:20

ポイント20pt

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

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません