正規表現を使った置換で、置換文字列の指定を「\$1」と指定してもエスケープが効かない

  1. Kuro さん

    お疲れさまです。
    バグっぽいものを見つけたのでご報告です。

    正規表現を使用した置換処理で、置換後文字列を「\$1」と指定しても、「$1」を指定したときのような挙動をします。

    再現手順は以下の通りです。

    編集中テキスト
    ------------
    aaabbb
    ------------

    「検索する文字列」に指定する文字列
    ------------
    aaa
    ------------

    「置換後の文字列」に指定する文字列
    ------------
    \$1
    ------------

    期待する結果
    ------------
    $1bbb
    ------------

    実際の結果
    ------------
    bbb
    ------------

     |  yuko  |  返信
  2. 横から失礼します。

    ver 2.6.11 のブログ記事のコメント欄で同様の質問・議論があって、ver 2.6.12 からは置換ダイアログ(正規表現オプション有効)の "検索する文字列" に「aaa」、"置換後の文字列"に「$$1」と指定することでエディタ上での置換結果が「aaa」→「$1」となる仕様になりました。
    readme.txt 内の更新履歴「▼ 2018/10/13 (2.6.12)」にも書かれていますが、以下のリンク先をご確認いただくのがよろしいかと。

    vid. https://www.haijin-boys.com/software/mery/mery-2-6-12#8
    ref. https://www.haijin-boys.com/software/mery/mery-2-6-11#comment-1865

     |  sukemaru  |  返信
  3. >> yuko さん

    ご報告ありがとうございます。

    これは sukemaru さんがご回答くださっている通りですね。色々とありまして現在の仕様に落ち着いています ^^;

    >> sukemaru さん

    サポートのご協力ありがとうございます ^^

     |  Kuro  |  返信
  4. sukemaru さん、Kuro さん

    ご回答ありがとうございます!
    このような議論があり、仕様となっていたのですね。不勉強で失礼しました^^;

    正規表現はエンジンによって方言があって、取り扱いが難しいですよね。

    鬼雲は Perl 系互換の正規表現ライブラリというイメージが強かったので、Perl と同じように「\$1」でエスケープされるものと思い込んでいました。

    複数エンジンで正規表現を確かめられる http://www.rexv.org/ で確認してみましたが、確かに Javascript では「$$1」でエスケープされますね。(このエスケープの仕方自体を初めて知りました…^^;)

    ところで、「$$1」形式でエスケープできるのは JScript の挙動に合わせて…というのは納得ですが、Perl 方式の「\$1」形式にも対応してみてはどうでしょう?

    そうすれば、Javascript 方式に慣れている人、 Perl 方式に慣れている人、両方が直感的に使えて一挙両得!みたいなことを思ったのですが、この形式にも対応することで何かデメリットがあったりするでしょうか?

     |  yuko  |  返信
  5. ご返信ありがとうございます。

    > このような議論があり、仕様となっていたのですね。不勉強で失礼しました^^;

    いえいえ。コメント欄での話題は検索してもヒットしづらいですからね ^^;

    > 鬼雲は Perl 系互換の正規表現ライブラリというイメージが強かったので、Perl と同じように「\$1」でエスケープされるものと思い込んでいました。

    Mery で使っている onigmo.dll は鬼雲の標準仕様の Ruby 系なので Perl 互換ではありません。

    同じ鬼雲でもサクラエディタさんなどで使われている bregonig.dll という鬼雲系のライブラリは Perl 互換を指向した仕様になっています。…が、逆に Perl (または互換) だと $$ は特殊変数なのでエスケープとして使えないんですよね ^^;

    > ところで、「$$1」形式でエスケープできるのは JScript の挙動に合わせて…というのは納得ですが、Perl 方式の「\$1」形式にも対応してみてはどうでしょう?

    これは sukemaru さんが貼ってくれた URL 先のコメント欄でも話題にあがっていますが、Mery は純正の onigmo.dll を使っているので Perl 系の表記法を無理に取り入れる必要はないと考えています。

    Perl 互換を考慮するならそもそも onigmo.dll ではなく bregonig.dll を使うべきですからね。

    なぜ bregonig.dll を使わないのか?という話になるとまた長い話になってしまうのですが… ^^;

     |  Kuro  |  返信
  6. > Mery で使っている onigmo.dll は鬼雲の標準仕様の Ruby 系なので Perl 互換ではありません。
    >
    > 同じ鬼雲でもサクラエディタさんなどで使われている bregonig.dll という鬼雲系のライブラリは Perl 互換を指向した仕様になっています。…が、逆に Perl (または互換) だと $$ は特殊変数なのでエスケープとして使えないんですよね ^^;

    ああー、なるほど…思えばそこから勘違いしてましたね…。

    私は昔サクラを使っていたので、その流れで初めて使った正規表現エンジンが bregonig.dll だったのですが、bregonig.dll は鬼雲 (鬼車?) 派生、ということだったので、「bregonig.dll は Perl 互換。つまり、派生元の鬼雲も Perl 互換」と今までずっと勘違いしてました^^;

    > これは sukemaru さんが貼ってくれた URL 先のコメント欄でも話題にあがっていますが、Mery は純正の onigmo.dll を使っているので Perl 系の表記法を無理に取り入れる必要はないと考えています。

    そうですね。それであれば、Ruby 互換は目指せど、Perl 互換を目指すのは変な話ですね。

    ご回答ありがとうございました。そして並びに、余計な要望を出してしまって申し訳ないです^^;

    ただ、おかげさまで正規表現知識がまた1レベル上がった気がします。ありがとうございました!

     |  yuko  |  返信
スポンサーリンク