すみません、もう1つ質問です。
テキストを「aabbcc*ddee」(*=どんな文字列でもマッチ)って感じで
検索して、「」の中を変数に得たいんですが、可能でしょうか?
Pos関数&Copy関数を試してみたんですがうまくいきませんでした・・
標準の機能でやるなら、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不要です。
あ、先を越されちゃいましたね^^;
たしか、にしのさんの紹介のほかに、
ワイルドカードを使って検索するクラスを作っている人が、
どこかにいたような…。
正規表現のほうが、もちろんできることは多いですけど。
ワイルドカード Delphi
あたりで、Googleなどを検索してみると、見つかるでしょう。
レスありがとうございます。
両方試してみて、正規表現の方が後々良いかなと思い、正規表現を使うことにしました。にしのさん、たかみちえさん、ありがとうございました。
で、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;
どうやら参照部分がうまくいってない様子。
どなたか参照の仕組みを教えて頂けないでしょうか?
正規表現が間違っていますよ。
msgにエラーが返ってくるので確認してください。
unmatched () in regexp
となっていると思います。
レスありがとうございます。
さっき別の関数を試してみて、そちらはうまくいきました。
お手数をかけてすみませんでした。
確認してみましたが、「モジュール'PROJECT1.EXE'のアドレス0045E333で
アドレスFFFFFFFFに対する読み込み違反が起きました」というエラーでした。
「unmatched () in regexp」と同じ意味でしょうか?
(あとCombBoxのItemsの個別での破棄の仕方を教えて頂けたら・・・駄目ですか?)
「正規表現中の括弧の対応があっていません」という意味です。
'('や')'などを、通常の文字として認識させるには、エスケープしないといけません。
なるほど、分かりました。
どうもありがとうございました。
ツイート | ![]() |