行頭の文字の置換?
-
いつも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 | 返信 -
ご愛用いただきありがとうございます。
> と再帰的?にすべて変換されてしまいます。
まず、行頭の文字の置換について、何が起きているかを把握されると分かりやすいかと思います。
いただいた例ですと、
[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 | 返信 -
ご返信ありがとうございます。
まず、よくある質問にあるにも関わらず、同じ質問をしてしまい申し訳ありませんでした。下調べの検索が足らず、お恥ずかしい限りです。また、具体的なスクリプトの例、大変感謝いたします。
正規表現がどうにも苦手なもので、具体例がなければ諦めていたかもしれません。| star | 返信