正規表現を使った検索(制御文字)

解決


Terry  2012-08-14 22:34:00  No: 42760

SkRegExp コンポーネントを使うに当たって
Mr.XRAY さんの
954_文字列の操作と正規表現「08_逐次検索 - SkRegularExpressions 使用」
http://mrxray.on.coocan.jp/Delphi/plSamples/954_SearchStr_Halbow.htm#08
を参考にさせていただいていますが
「制御文字等を含む位置なのでキャレット位置を再検索」と
最終的に RichEdit1.FindText を使われているようです

「\n」や「\t」など制御文字等自体をヒットさせるには
リッチエディットの SelStart との食い違いを調整しなければいけないと思うのですがよい方法はないでしょうか?
以上、よろしくお願いいたしますm(_ _)m


Mr.XRAY  2012-08-16 19:35:06  No: 42761

こんにちは,Mr.XRAYです.

あら!? もしかして,Terryさん?

懐かしいようなお名前があったのでレスしてしまいました.
「難解」な記事を読んで頂き,恐縮です.

>リッチエディットの SelStart との食い違いを調整しなければいけないと思うのですが

ですよね.私もいい方法があったら知りたいです.
サンプルでは,姑息な手段で逃げてしまっているものですから.
スミマセン.解決策でなくて.
ゴミレス? でした.


Terry  2012-08-16 20:03:16  No: 42762

ご無沙汰してます
最近は某掲示板で NanaTree 派生版作ってます

師匠ならなんか力業とか必殺技とか隠されてるんじゃないかと思ってましたが
やっぱり難しいですね
ありがとうございました


Terry  2012-08-17 06:58:08  No: 42763

Delphi1Delphi2
Delphi3Delphi4

「^Delphi」で検索しますと
二回目の「Delphi3」ヒットで FindText では「Delphi2」を選択して
終わってしまうようです
やはり何かしら考えないといけないようです〜


Mr.XRAY  2012-08-17 09:01:33  No: 42764

あら !?
う〜む.そうなると.
Terry さんの成果に期待するしかないですね.
よろしくお願いしま〜す.(^^;
冗談はともかく.う〜ん.


Atchoum  2012-08-17 18:43:42  No: 42765

これは要約すると、
正規表現だと改行を含めた位置を返すため、そのままRichEditの位置を選択すると改行分選択したい位置がずれてしまうということでよいですか?

integerの配列に、どの位置に改行があるかを保持して、
Matchが返してきた位置の前にいくつ改行があったかを調べ、
その分RichEditで選択する位置を左にずらすという方法はどうでしょうか?

質問の理解が間違っていたらごめんなさい。


Terry  2012-08-18 04:33:21  No: 42766

Atchoum さん、ありがとうございます
そうですね「\n」自体はヒットしませんが一応上記の「^Delphi」は
正常に動作するようです

function GetLineBreak(S:string):integer;
var
  Collection:TMatchCollection;
begin
  Collection:=TRegEx.Matches(S,'\n',[roMultiLine]);
  Result:=Collection.Count;
end;

var
  GetLineBreakCount:integer;

  for Match in TRegEx.Matches(RichEdit1.Text, Edit1.Text, [roIgnoreCase,roMultiLine]) do begin
    AStr := Match.Value;
    ALen := Match.Length;
    if (ALen > 0) {and (Trim(AStr) <> '')} then begin
      if Match.Index>0 then
      begin
        GetLineBreakCount:=GetLineBreak(Copy(RichEdit1.Text,
                                             0,
                                             Match.Index-1));
//        Memo1.Lines.Add(IntToStr(GetLineBreakCount));
        CurPos :=Match.Index-1-GetLineBreakCount;
      end;
……(ry
とりあえず解決とさせていただきます
ありがとうございました


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加