|
>>perl5.6 から入れ子の括弧に対応した記述が可能です.
>>http://www.din.or.jp/~ohzaki/regex.htm#GetNestedParen
>>が, (ほげ(ほげ(ほげ))ほげ) というような入れ子を許してマッチする正規表現のサ
>>ンプルスクリプトになります.
>いや、これって「Perlのコード」であって、単純な「正規表現パターン」とは言
>えないんじゃないかと…
>たとえば「括弧のネストが3より深い部分を削除」
>(1(2)1(2(3)2(3(4)3)2)1(2(3)2)1)
>↓
>(1(2)1(222)1(22)1)
>なんてことを
>検索:foo
>置換:bar
>という記述でできるかどうかという問題なんですが。
なるほど,たしかに「検索」と「置換」を与えられてという意味だとサンプルスクリ
プトでは駄目ですね.
しかし,それでも可能です.
$str = q{(1(2)1(2(3)2(3(4)3)2)1(2(3)2)1)};
$str =~ s/(\((?{$nest++})|[^()]+|\)(?{$nest--}))/@{[&{sub {$nest < 3 ? (($ne
st == 2 and $1 eq ')') ? "" : $1) : ""}}]}/g;
print $str, "\n";
とか,もっと極端な書き方をすると,
$str =~ s/(.*)/@{[&{sub {$1 を処理するコード}}]}/g;
とすれば何でも可能です.
$str =~ s{(?=(.*))(??{$1 から正規表現を作り出すコード})}{bar};
のように,(??{code}) で正規表現を作り出すこともできますし,@{[&{sub {cod
e}}]} で置換後の文字列を作り出すこともできるので,「検索」と「置換」を与えら
れてできないということはないでしょう.
perl5.6以降ではどちらにもコードを埋め込むことが可能になったことで何でもでき
るのです.
|
|