/ 最近 .rdf 追記 編集 設定 本棚

脳log[20110509] Re: 正規表現による複数行検索対応(簡易版)



2011年05月09日 (月) 原文を見なくてもわかる日本語訳のミス。>「グーグル社員の間でも、黄の社員証の階級はほとんど知られていない。彼らのビルは3.1459~という棟で、

最終更新: 2011-05-10T18:49+0900

[SakuraEditor] Re: 正規表現による複数行検索対応(簡易版)

 GetCountOfDividedStringW()はいけてない。

どういう関数?>「改行のエスケープシーケンス('\\'+'n')で区切られる文字列の個数を数える(WCHAR版)」

使われ方>「複数行指定方法の改善(正規表現パターンの行数とダイアログ設定値の大きい方を採用する)」

  • \rに対応していない。
  • LFの直書きに対応していない。(CRの貼り付けはできなかったのでとりあえず LFだけ)
  • 量指定子に対応していない。
  • \x0D\x00\x0A\x00や \x{0D}\x{0A}に対応していない。
  • [\s\S] や \s, [\w\W] や \W, . (sフラグONのドット)に対応していない。

これだけ対応していないなら「正規表現による」というより、\nというエスケープシーケンスにだけ対応した普通の検索といったほうが当たってる。正規表現ライブラリに今以上の機能(hitEnd)を求めないのなら、これが最大限度の対応なのかもしれないが……。GetCountOfDividedStringWには期待せず、ダイアログで 100とか設定しておけば大体はうまくいくのかもしれない。

 CMultiLineSearch::GetCompensationLengthには脱帽。

どういう関数?>「0文字マッチや改行文字の途中を考慮した置換文字数の補正値を取得する」

なぜ必要?>ドキュメントの操作がビュー経由でしか行えないため、ロジック単位で行った検索をレイアウト単位に変換してから置換を実行しなければいけない。置換関数の中ではレイアウト単位をロジック単位に変換して……といったことがもちろん行われるわけで……ムキー、ってなことを 20100907p01.03に書いた。

とりあえずロジック単位で置換範囲を指定できる置換関数をどこかに作ろうとして、20100709p01の複数行置換の実装は止まっている。CMultiLineSearch::GetCompensationLengthを使うアプローチはこれまでのやり方を踏襲するもので、置換範囲と置換文字列をレイアウト単位境界にそろえてから置換関数を呼び出す。計画倒れよりできあがってる方が偉い。