こういった場合、今まで
-------------------------------------------------
##直後に"mogemoge"含まない文字列にマッチ
$str =~ /hogehoge[^(mogemoge)]/;
-------------------------------------------------
これでいけたような気がしたんだが、久々に同じような処理を書いてみたら
これではダメだった。
前回はなんでうまくいったのか分からないが、クラスのマッチはやはり
一文字分しか指定できないらしいので、セオリーどおり、否定先読みを使う。
-------------------------------------------------
##直後に"mogemoge"含まない文字列にマッチ
$str =~ /hogehoge(?!mogemoge)/;
##"mogemoge"の部分はさらに正規表現を使ったり、変数を使ったりもできる
my $later = "moge";
$str1 = "hogehoge";
$str2 = "hogehogemogemoge";
$str1 =~ s/hogehoge(?!($later){1,})/oeoe/;
$str2 =~ s/hogehoge(?!($later){1,})/oeoe/;
print $str1."
".$str2;
結果:
hogehogeoeoe
hogehogemogemoge
-------------------------------------------------
逆に、特定の文字列を後方に含む場合は
(?!mogemoge) を (?=mogemoge)
にかればいいだけ。
-------------------------------------------------
##直後に"mogemoge"含まない文字列にマッチ
$str =~ /hogehoge[^(mogemoge)]/;
-------------------------------------------------
これでいけたような気がしたんだが、久々に同じような処理を書いてみたら
これではダメだった。
前回はなんでうまくいったのか分からないが、クラスのマッチはやはり
一文字分しか指定できないらしいので、セオリーどおり、否定先読みを使う。
-------------------------------------------------
##直後に"mogemoge"含まない文字列にマッチ
$str =~ /hogehoge(?!mogemoge)/;
##"mogemoge"の部分はさらに正規表現を使ったり、変数を使ったりもできる
my $later = "moge";
$str1 = "hogehoge";
$str2 = "hogehogemogemoge";
$str1 =~ s/hogehoge(?!($later){1,})/oeoe/;
$str2 =~ s/hogehoge(?!($later){1,})/oeoe/;
print $str1."
".$str2;
結果:
hogehogeoeoe
hogehogemogemoge
-------------------------------------------------
逆に、特定の文字列を後方に含む場合は
(?!mogemoge) を (?=mogemoge)
にかればいいだけ。

コメントする