行頭の文字の置換?

  1. いつもMeryにてお世話になっております。
    マクロについてどうしても分からないところがありまして、
    お力添え願えましたら大変幸いです。

    まず例としまして、
    [tab]test[tab]test
    [tab][tab]test2
    と言う選択範囲があるとします。行頭の[tab]文字をひとつを削除し、
    test[tab]test
    [tab]test2
    のような結果を返すマクロを記述したいと考えています。
    (要は逆インデントなのですが、後で色々拡張しようと考えています。)

    document.selection.Replace("^\t", "", meFindReplaceRegExp | meFindNext | meFindAround);
    を実行すると、
    test[tab]test
    [tab][tab]test2
    となり、最初の行しか削除されず、
    document.selection.Replace("^\t", "", meFindReplaceRegExp | meFindNext | meFindAround | meReplaceAll);
    を実行すると、
    test[tab]test
    test2
    と再帰的?にすべて変換されてしまいます。
    一度だけ、[tab]を変換するには、どうしたらよろしいでしょうか。

     |  star  |  返信
  2. ご愛用いただきありがとうございます。

    > と再帰的?にすべて変換されてしまいます。

    まず、行頭の文字の置換について、何が起きているかを把握されると分かりやすいかと思います。

    いただいた例ですと、

    [tab]test[tab]test
    [tab][tab]test2

    この状態で、カーソルを先頭に持ってきて、Mery のメニューから [検索] > [置換] を選択して置換ダイアログを表示します。

    [検索する文字列] には ^\t を入力し、[置換後の文字列] を空欄にし、[正規表現を使用する] をオンにして、[置換] ボタンを連続してクリックしてみてください。

    また、[すべて置換] ボタンを押すことでも、同様の結果となります。

    この動作はマクロの document.selection.Replace でも同じです。

    > 一度だけ、[tab]を変換するには、どうしたらよろしいでしょうか。

    簡単な方法としては、正規表現で行頭 (^) だけでなく、行末 ($) も含め、行単位で置換します。

    [検索する文字列] を ^\t(.*)$ とし、[置換後の文字列] を \1 とします。

    マクロであれば、次のようになります。

    document.selection.Replace("^\\t(.*)$", "\\1", meFindNext | meFindReplaceRegExp | meReplaceAll);

    また、マクロの場合、JavaScript の正規表現を使って gm フラグを指定すれば、^\t を行頭のタブ文字として認識させることもできます。

    document.Text = document.Text.replace(/^\t/gm, "");

    詳しくは、MeryWiki の [よくある質問] に記載されていますので、ご確認いただければと思います。

    【参考】よくある質問 - MeryWiki
    https://www.haijin-boys.com/wiki/よくある質問#正規表現を使った行頭の置換が期待どおりに動作しない

     |  Kuro  |  返信
  3. ご返信ありがとうございます。
    まず、よくある質問にあるにも関わらず、同じ質問をしてしまい申し訳ありませんでした。下調べの検索が足らず、お恥ずかしい限りです。

    また、具体的なスクリプトの例、大変感謝いたします。
    正規表現がどうにも苦手なもので、具体例がなければ諦めていたかもしれません。

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