Movable Typeの管理画面で検索/置換を利用する際、正規表現にチェックを入れて置換をすることがあるのですが、置換文字列に$1
を書いて、置換結果が$1
だらけになることがあります(笑) 例えば、タイトルの特定の文字を消し、(.*?)
でマッチした部分を残したい場合です。
書き方が違うという可能性を考えつつ昨夜ソースを探ってみたところ、lib/MT/CMS/Search.pm
の1806行目付近に次のようなコードがありました。
$text =~ s!$re!$replace!g
そこで、Perl初心者ながら$replace
で$1
等は使えないのかと調べてみたところ、「regex - How to use a variable in the replacement side of the Perl substitution operator? - Stack Overflow」の記事を見つけました。結論としては、今のコードではマッチした文字を使うことは無理なようです。$text =~ s!$re!$replace!gee
のように、オプションでee
を指定すると意図した動作--マッチした文字が使えるようです。
というわけで、FogBugzにCase 113843を作成して機能リクエストさせて頂きました。ご検討よろしくお願いします。
ちなみにregex_replace
フィルタは、eval '$str =~ s/$re/' . $replace . '/' . ( $global ? 'g' : '' );
のような実装なのでマッチした文字が使えるのだと思います。