◀一般トップへ
  • 4742 行頭空白削除時のバグ
    • 4743 Re:行頭文字削除
      • 4751 Re2:行頭文字削除
        • 4752 Re3:行頭文字削除
  • [4742] 行頭空白削除時のバグ FOOTPRINT 2005年10月15日 10:54

    正規表現を利用して
    置換前 "^ " (行頭+空白1文字)
    置換後 ""  (空文字列)
    として、各行に対して行頭の空白を1文字だけ削除したいの
    ですが、これを実行すると、行頭の空白が2文字以上の
    行において全ての行頭空白が削除されてしまいます。

    具体的には、

    +------------------
    + 1
    + 2
    + 3
    +------------------
    ↑こんな感じのファイルを

    +------------------
    +1
    + 2
    + 3
    +------------------
    ↑こうしたいのですが

    +------------------
    +1
    +2
    +3
    +------------------
    ↑こうなってしまいます。
    • [4743] Re:行頭文字削除 じゅうじ 2005年10月15日 12:12

      > ↑こうなってしまいます。

      +-----
      |abab
      +-----

      で"^ab"でもなるね。

      少し古いsakuraでも。
      sakura V1.4.7.0
      • [4751] Re2:行頭文字削除 Thor 2005年10月18日 21:21

        以前のとまったく同じ話題ですね
        [4505] 正規表現の置換について(行頭)
        http://sakura-editor.sourceforge.net/cgi-bin/cyclamen/cyclamen.cgi?tree=r4505

        BREGEXPの全置換を使えば、この問題は起こらないですよね。
        前にも書きましたがJmeditor2やK2EditorではBREGEXPで全置換しているので
        問題は起きません。

        これもまた前にも書いたんですが
        置換対象文字列全体は「$&」で呼び出せるので、
        選択始点挿入にしたときは「置換後の文字列+$&」
        選択終点追加にしたときは「$&+置換後の文字列」
        とすれば、一つ一つ文字列を切り分けてから置換せずとも、
        一行全体を全置換できると思うのですが

        もしくは、BREGEXPに更に手を入れて引数の文字列が、
        行頭を含むのか含まないのかを指定できるようにするとか。


        以前に、鬼車をラッピングしたBREGEXPと差し替えられるDLLを作りました。
        サクラエディタで使うと、戻り読み(後読み)を含んだ置換ができませんでした。
        初回にマッチした文字列にはそれより前方の文字が含まれてないので、
        実際の置換の時にマッチしなくなり、置換に失敗。
        と、勝手に想像。
        (実際にサクラエディタの動作を調べたわけではありません)


        製作者の方々に質問があります。
        置換するのに、行からマッチする部分だけを抜き出して、
        その部分文字列に対して置換するのはなぜなんでしょうか?
        わざわざ複雑なことをしているからには、なにか理由があるとおもうのですが。
        • [4752] Re3:行頭文字削除 かろと 2005年10月19日 00:35

          >タイトル: Re3:行頭文字削除
          >発言者: Thor
          >以前のとまったく同じ話題ですね
          >[4505] 正規表現の置換について(行頭)
          >http://sakura-editor.sourceforge.net/cgi-bin/cyclamen/cyclamen.cgi?tree=r4505
          >
          >BREGEXPの全置換を使えば、この問題は起こらないですよね。
          >前にも書きましたがJmeditor2やK2EditorではBREGEXPで全置換しているので
          >問題は起きません。

          これは、K2Editorの「全置換」のことを言われていると思いますが、

          ----------- K2Editorのヘルプより抜粋 ここから
          通常の置換と全置換の違い
          K2Editorの置換は、全置換と通常の置換で動作が違います。

          通常の置換(連続置換も含む)
          置換を行った後、置換語の次の文字から再度検索を行います。 つまり次の置換は、置換された語の影響を受けます。

          全置換
          全文書の文字列を検索しながら、置換語を含む新しい文字列を生成します。 そのため、検索は常に置換前の文字列に対して行われるため、 置換語の影響を受けません。

          s/regexp/replaceexp/g という風に、gオプションを使用します。

          特殊な正規表現検索以外では動作は同じになりますが、 単語境界(\b)を使った検索などでは、置換後の状態が検索に影響するので、 両者に違いが出る場合があります。
          ----------- K2Editorのヘルプより抜粋 ここまで

          とあるように、K2Editorでは、通常の置換と全置換の動作が異なることを仕様として、実現していると考えるべきです。
          現に、通常置換を繰り返す「連続置換」を行うと、行頭文字に何度もマッチして消えていきます。


          「通常置換」と「全置換」の動作が異なる。というのは、別の問題
          (例えば、通常置換で動作を確認して、全置換すると、思った結果にならない)
          を引き起こすという事も考慮する必要があり、
          現状のサクラは、あえて「通常置換」と「全置換」の動作を同じにする仕様なのではないかと推測します。


          これを問題とするか仕様とするか意見の分かれるところなのですが、
          こうも何度も出てくると、
          「通常置換」と「全置換」の動作が異ならないモードと
          「通常置換」と「全置換」の動作が異なるが、この問題が起こらないモードと
          オプションで切り替える設定ができるのが、よいのかもしれませんね。どなたかお願いします。


          >置換するのに、行からマッチする部分だけを抜き出して、
          >その部分文字列に対して置換するのはなぜなんでしょうか?
          >わざわざ複雑なことをしているからには、なにか理由があるとおもうのですが。

          Apr. 29, 2005 (1.5.3.1)以降、
          マッチする部分を抜き出して・・・の処理は、なくなってます。

          では