Menu

#54 正規表現による複数行検索対応(簡易版)

open
nobody
None
5
2016-08-06
2008-11-18
nasukoji
No

正規表現による検索/Grep/置換において、複数行
指定に対応します。

ANSI版Patches#2016120と同一内容です。
(ただし、選択範囲の全置換で最下行が置換されない
バグがあったので修正しています)

正規表現ライブラリとのインタフェース部分には
手を加えていませんので、正規表現ライブラリを変更
する必要はありません。今まで通り鬼車が使用可能
です。

複数行つなぎ合わせたバッファを正規表現ライブラリ
に渡す事で複数行に対応します。

検索/Grep/置換ダイアログにて「検索ライブラリへ
渡す最小行数」を設定を追加していますが、可変個の
改行を含んで検索する場合以外は1を設定しておけば
OKです。

行数設定に指定可能な行数は0~9999です。
「検索ライブラリへ渡す最小行数」の設定パターン
 0:非複数行検索(ほとんど現在のリリース版と
  同じ動作)
 1:検索パターン内の'\\'+'n'を区切りとした
  文字列数
 2以上:ダイアログと検索パターンのどちらか
  大きい方

(巨大な数字を指定しても遅くなるだけで意味は
殆どありません)

現状できること
・検索
・Grep
・置換

中途半端にできること(動作するが行数指定の方法を
提供していないので前回値で動作する)
・正規表現インクリメンタルサーチ
・マクロによる正規表現検索/Grep/置換

できないこと(未設計)
・複数行時の検索文字列のカラーリング
 ロジックが複雑すぎて無理 (^^;

その他うまく作れていない所
・Grep時の行数指定がコマンドライン化されていない
・すべて置換実行の関数
 レイアウト行と物理行が絡みすぎてうまく対応でき
 なかった (^^; ので、Command_REPLACE_ALL()を
 コピーしてCommand_REPLACE_ALL_MULTILINE()を新規
 に作りました。
・文字列の個数を数える関数
 GetCountOfDividedStringW()を作りましたが、変。

Discussion

  • nasukoji

    nasukoji - 2008-11-18

    正規表現による複数行検索対応(簡易版)

     
  • nasukoji

    nasukoji - 2009-08-18

    rev1645対応。ライセンス表記を一部変更。

     
  • nasukoji

    nasukoji - 2009-08-18

    rev1645対応
    ライセンス表記を一部変更

    ANSI版New@MultiLineSearch_A_7.patchと同内容です。

     
  • nasukoji

    nasukoji - 2010-04-20

    rev1749対応

    ANSI版New@MultiLineSearch_A_8.patchと同内容です。

     
  • nasukoji

    nasukoji - 2010-04-20

    rev1749対応

     
  • syat

    syat - 2011-11-21

    rev1967に対応したパッチとテストバイナリをアップしました。
    http://loda.jp/sakura_editor/?id=29.zip

    私のPCが病んでいるだけかもしれませんが、New@MultiLineSearch_U_3.patchをそのままr1967に対応させたところ、デバッグビルドだとうまく動くのに、リリースビルドだとおかしな挙動になりました。(検索行を2行以上にすると、該当の選択開始位置が前の行の末尾になる)
    調べると、CMultiLineSearch::GetStringLengthは引数の値によって「検索バッファ全体の文字列長」か「指定行の文字列長」を切り替えるのですが、うちのリリースビルドだと引数がどんなでも「バッファ全体」ルートに入ることが判明。いくらステップ実行しても理解不能な動きをするので、なんらかの魔最適化がおこなわれているのではと推測します。(VC2008EEです)
    NoOptパッチは、関数を引数の有無でわけて最適化を殺すもので、こちらだと私の環境ではうまく動きます。
    同じ現象がおこるか試していただけるとありがたいです。

     
  • nasukoji

    nasukoji - 2011-11-22

    rev1968対応

     
  • nasukoji

    nasukoji - 2011-11-22

    rev1968対応しました(ただし軽く確認しただけです)

    syatさん
    すみません、VC2005,VC2008のReleaseだと元からだめだった様です。
    VC2010だと予定通りの挙動となります。

    なぜか CMultiLineSearch.cpp 585行目の 0 <= nLineNum が正常に判定されません。

    NG)if( 0 <= nLineNum && nLineNum < m_nMaxSearchLines ){
    OK)if( nLineNum >= 0 && nLineNum < m_nMaxSearchLines ){

    その他 CGrepAgent.cpp 1136行目 を変更しました。

    旧)while( nIndex <= nTextLen && pRegexp->Match( pCompareData, nTextLen, 0 ) ){
    新)while( nIndex <= nLineLen && pRegexp->Match( pLine, nTextLen, nIndex ) ){

    とりあえず検索機能が動くことは動くのですが以下のような問題が残ったままです。
    ・マクロからの検索/Grep/置換で行数指定できない(前回値が使用される)
    ・Grep時の行数指定がコマンドライン化されていない
    ・複数行の強調表示に未対応

    あと、改行を数える関数が変です (^^;

    結局完成度が低い(特に描画処理はお手上げ)ので現在は放置状態です。

     
  • syat

    syat - 2011-11-23

    NG)if( 0 <= nLineNum && nLineNum < m_nMaxSearchLines ){
    OK)if( nLineNum >= 0 && nLineNum < m_nMaxSearchLines ){
    VC・・・。

    パッチは時間が無くてまだ確認できていません。
    複数行検索がほしいひとには、現在の動きでも十分有難いのでは、と個人的には思います。

    ・マクロからの検索/Grep/置換で行数指定できない(前回値が使用される)
    これは既存マクロに影響がでそうなのでどうにかしたいところ。

    ・Grep時の行数指定がコマンドライン化されていない
    あまり優先度は高くないと思います。(コマンドラインを使いこなす人≒複数行検索なくてもやってける人)

    ・複数行の強調表示に未対応
    できれば欲しいですけれど、なくても困りません。

     
  • nasukoji

    nasukoji - 2011-11-28

    rev1972対応

     
  • nasukoji

    nasukoji - 2011-11-28

    rev1972対応しました。
    CViewCommander.cpp Command_REPLACE_ALL_MULTILINE() に rev1803, 1824, 1825, 1868
    での Command_REPLACE_ALL() への変更を取り込みました(その他おかしな所を修正)

    気になる所としては、
    CNormalProcess.cpp InitializeProcess() の DoGrep() する所にて、引数に空きが無い
    ため共有メモリの m_nMultiLineSearchMin を渡しています。

    util/string_ex2.cpp GetCountOfDividedStringW() の作りがかなりいい加減です。

     
  • Moca

    Moca - 2011-12-01

    該当行マークは先頭行だけでいいんでしょうか。
    複数行選択した場合はそれぞれの行にマークがつきます。
    先頭行だけのほうがマークを飛ぶのに都合がよいのでそのままでいいかな。

    細かいことですみません。
    m_nCurSrchMultiLineNum/m_nMultiLineSearchMinは
    SSearchOptionに入れてはだめでしょうか。
    入れないならCGrepAgent::DoGrepのnMultiLineSearchNumはnMultiLineSearchMinではないでしょうか。
    GrepAgent.cpp #include "StdAfx.h" が2つあります。

     
  • nasukoji

    nasukoji - 2011-12-05

    該当行マークは先頭行だけでいいんでしょうか。

    現状は楽な方になっているだけですので、要望しだい……な感じです (^^;

    m_nCurSrchMultiLineNum/m_nMultiLineSearchMinは
    SSearchOptionに入れてはだめでしょうか。

    現在その方向でソース編集中です。
    m_nCurSrchMultiLineNum を nMultiLineSearchNum に変更していますが、nCurSrchMultiLineNum のままの方が良いでしょうか?

     
  • Moca

    Moca - 2013-05-24

    rev3058対応

     
  • Moca

    Moca - 2013-07-01

    rev3189対応
    ・nMultiLineNum回りを少し修正

     

    Last edit: Moca 2013-07-01
  • Moca

    Moca - 2013-07-01

    ・マクロ対応(未テスト)

    バグらしい動作:
    ・「(\r\n{3})」等で、改行が4つ以上連続であると、次検索が選択範囲を飛ばしてくれないようです。
    (「aaaaaaaa」で「aa」を次検索すると4回ヒットするのに)
    ・選択範囲での置換で、置換後の選択範囲の末尾が通常のすべて置換と違う動作をします。

     
  • Moca

    Moca - 2014-06-08

    ・検索ライブラリ(に|へ)渡す最小行数と表記ゆれしていたので「に」に統一
    ・Grepダイアログで(&G)がダブっていたので(&Q)に変更
    ・2013-07-01のときGREPの行数指定コマンドラインにバグがあったのを修正
    ・マクロ周りのパッチの細かいバグの修正

     
  • Moca

    Moca - 2015-03-06

    ・すべて置換の多言語化、高速モード、行削除モード対応
    ・Grep置換未対応
    ・またアクセスキーが被ってるので(&4)に変更

     
  • Moca

    Moca - 2016-08-06

    ・多言語化対応(英語)がU10に含まれてなかったので再度修正
    ・Grep置換未対応
    conflictその他最新化対応

     

Log in to post a comment.