正規表現での置換について

  1. いつもMeryを使わさせて頂いています。
    Ver. 2.5.6 を使っているのですが、以下のような行頭に4つの半角スペース( 「 _ 」 でスペースを表現)がありこのうち2つだけを削除したい時に

    _ _ _ _ abc

    正規表現によるマッチを有効にして検索パターンとして以下を指定して(半角スペース( 「 _ 」 )置換を行った時に全てのスペースが削除されて、

    ^_ _

    以下のようになってしまいます。 

    abc

    これは、鬼車の仕様でしょうか。

     |  kuni255  |  返信
  2. ご愛用ありがとうございます。

    > これは、鬼車の仕様でしょうか。

    鬼車の仕様ではなく Mery の仕様です。

    エディタによっては全体に対して 1 度だけ置換をかける方式もありますが、Mery では置換を繰り返す方式を採用しており、そのための仕様です。(状況によってどちらの方式も一長一短あります)

    ご提示いただいた条件で「すべて置換」ではなく「置換」ボタンを連打してみると、どういう仕組みでその結果になっているかお分かり頂けるかと思います。

    行頭の空白 2 つを除去する場合は、置換後にキャレットが行頭に残らないようにちょっと細工が必要です。

    ※半角スペースはそのまま「 」←半角スペースでそのまま示してます

    検索する文字列:
    ^  (.*)$

    置換後の文字列:
    \1

    こんな感じで置換すれば行頭の空白 2 つを除去できるかと思います。(他にももっとシンプルな書き方があるかもしれませんが)

    置換の仕様につきましては、Mery 方式だと、一見、コレで行けるんちゃう?ってときにちょっと予想とちがう結果になってしまうこともありますが、その代わりに置換や検索で取りこぼしが発生しないため、正規表現をがんばりさえすれば非常に柔軟な検索・置換が可能になります。

    Mery の開発でも使用している統合開発環境の「Delphi」や、海外で人気のプログラマ向けテキストエディタ「NotePad++」などは Mery と同じ方式だと思われます。正規表現に詳しくなるとコッチの方式のほうが細かいことができるので評判が良いようです。

     |  Kuro  |  返信
  3. 結局は慣れの問題ですね。UNIXライクな環境のsedと同じ挙動を「全て置換」ボタンを押した時に期待したのが今回の投稿のきっかけでした。

    sed -e 's/^  //g' もしくは sed -e 's/^ \{2\}//g'

    得られる結果は同じですが、”行頭のスペース2つを削除したい”時に
    ————————————
    検索する文字列:
    ^  (.*)$

    置換後の文字列:
    \1
    ————————————

    と指定するのは直感的では無い気がします。置換後の文字列は、””の方が私はしっくりきます。冒頭でも書きましたがやはり慣れの問題なので慣れることにします。

    しかしながら、Meryはコンセプトが好きです。
    1. notepad.exe 以上 MS Word 未満
    2. 軽快な起動
    3. インストール後特別な設定等をせずとも日本語のテキストを表示
    これからも愛用させて頂きます。

     |  kuni255  |  返信
  4. ご返信ありがとうございます。

    > 結局は慣れの問題ですね。UNIXライクな環境のsedと同じ挙動を「全て置換」ボタンを押した時に期待したのが今回の投稿のきっかけでした。

    そう言っていただけると助かります。
    確かにおっしゃる通り、Mery方式のほうがマイナーなので時々「バグじゃね?」というご意見をいただきますが、こういう仕様のエディタもあるよ。ということで…

    > しかしながら、Meryはコンセプトが好きです。

    ありがとうございます。
    メモ帳の代替品というポジションで地味にやっていけたらなと思いますので、今後とも応援よろしくお願いいたします。

     |  Kuro  |  返信