文字列検索って出来ますか?

解決


kazu  2003-02-20 04:03:15  No: 2972

すみません、もう1つ質問です。

テキストを「aabbcc*ddee」(*=どんな文字列でもマッチ)って感じで
検索して、「」の中を変数に得たいんですが、可能でしょうか?
Pos関数&Copy関数を試してみたんですがうまくいきませんでした・・


にしの  2003-02-20 09:01:14  No: 2973

標準の機能でやるなら、PosとCopyですね。
そんなに難しいことでもないのですが、*の部分が複数あると面倒です。
正規表現のコンポーネントを使えば、たとえばこの例なら、/aabbcc.*ddee/にマッチさせればよいのでできます。
もっと複雑なパターンも、たいていは正規表現で表せます。

Delphian World
http://home1.infonia.ne.jp/~delphian/delphi/
に、BREGEXP.DLL(正規表現が使えるDLL)のラッパーコンポーネントがあります。

http://homepage1.nifty.com/bmonkey/delphi/delphi.html
にも、正規表現の使えるコンポーネントがあります。こちらはDLL不要です。


たかみちえ  URL  2003-02-20 09:08:07  No: 2974

あ、先を越されちゃいましたね^^;

  たしか、にしのさんの紹介のほかに、
ワイルドカードを使って検索するクラスを作っている人が、
どこかにいたような…。
  正規表現のほうが、もちろんできることは多いですけど。

ワイルドカード Delphi
  あたりで、Googleなどを検索してみると、見つかるでしょう。


kazu  2003-02-20 19:45:06  No: 2975

レスありがとうございます。
両方試してみて、正規表現の方が後々良いかなと思い、正規表現を使うことにしました。にしのさん、たかみちえさん、ありがとうございました。

で、BRegExp.pasをDelphi6で使うと互換性の関係でエラーになる
とのことだったので、コンパイラの文法オプションで「型付定数への代入」に
チェックを入れたところ、動作しました。
ヘルプからコピーしてきた文はうまくいったのですが、↓だと
「Project1.exeがEAccessViolationクラスの例外を生成しました。」
というエラーが出ます。何故でしょう?

procedure TForm1.Button1Click(Sender: TObject);
var pBRegExp: PTBRegExpRec;

    msg: array [0..255] of Char;

    s,t: string;

    sp, ep: PPChar;

begin

    pBRegExp:=nil;

    s := ',$rw,$kl,$tw,$om) = ';

    BMatch('m/,$rw,$kl.*)/',PChar(s),PChar(s)+Length(s),pBRegExp,@msg[0]);

    sp:=pBRegExp^.startp;

    ep:=pBRegExp^.endp;

    while Integer(sp^)<Integer(ep^) do begin

        SetLength(t, Integer(ep^)-Integer(sp^));

        Move(sp^^, PChar(t)^, Integer(ep^)-Integer(sp^));

        Memo1.Lines.Add(t);

        Inc(sp);

        Inc(ep);

    end;

    // '123;456;789'

    // '123'

    // '456'

    // '789'

    BRegFree(pBRegExp);

end;


kazu  2003-02-21 07:56:04  No: 2976

どうやら参照部分がうまくいってない様子。
どなたか参照の仕組みを教えて頂けないでしょうか?


にしの  2003-02-21 08:44:45  No: 2977

正規表現が間違っていますよ。
msgにエラーが返ってくるので確認してください。

unmatched () in regexp

となっていると思います。


kazu  2003-02-21 17:48:14  No: 2978

レスありがとうございます。
さっき別の関数を試してみて、そちらはうまくいきました。
お手数をかけてすみませんでした。
確認してみましたが、「モジュール'PROJECT1.EXE'のアドレス0045E333で
アドレスFFFFFFFFに対する読み込み違反が起きました」というエラーでした。
「unmatched () in regexp」と同じ意味でしょうか?

(あとCombBoxのItemsの個別での破棄の仕方を教えて頂けたら・・・駄目ですか?)


にしの  2003-02-21 18:13:15  No: 2979

「正規表現中の括弧の対応があっていません」という意味です。
'('や')'などを、通常の文字として認識させるには、エスケープしないといけません。


kazu  2003-02-21 18:23:20  No: 2980

なるほど、分かりました。
どうもありがとうございました。


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

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






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