Delphi XE2 の正規表現クラスについて教えてください。
uses に RegularExpressions を追加し、フォームにボタンをひと
つ置き、OnClick イベントに以下のコードを貼り付けます。
procedure TForm1.Button1Click(Sender: TObject);
var
Matches: TMatchCollection;
grp: TGroupCollection;
begin
Matches := TRegEx.Matches('12.A', '^(\d+)\.(\w+)$');
if Matches.Count = 1 then
begin
grp := Matches[0].Groups;
ShowMessage(grp[1].Value + grp[2].Value); // (1)
ShowMessage(grp[1].Value + '' + grp[2].Value); // (2)
ShowMessage(Format('%s%s', [grp[1].Value, grp[2].Value])); // (3)
end;
end;
実行してボタンをクリックすると、(1) の行で以下のようなデバッ
ガ例外通知が出ます。
プロジェクト Project3.exe は例外クラス $C0000005 (メッセ
ージ 'access violation at 0x00407b00: read of address
0x00000039')を送出しました。
TGroup.Value は string 型なので + 演算子で結合できると思うの
ですが、何がいけないのでしょうか。(2) のように文字列リテラル
をはさむと例外は発生しません。(3) も問題なく実行されます。
何か根本的な勘違いをしているのでしょうか。ご教示、よろしくお
願いします。
--
春原 宏保 (すのはら ひろやす)
suno...@gmail.com
http://d.hatena.ne.jp/suno88/
http://twitter.com/suno88
MLホームページ: http://www.freeml.com/delphi-users
----------------------------------------------------------------------
練習や試合の予定調整は「とっとと決め太郎」におまかせ!
http://ad.freeml.com/cgi-bin/sa.cgi?id=h7h2H
-----------------------------------------------------[freeml by GMO]--
Access Violation ということは、メモリアドレスエラーということなので、
配列の範囲外にアクセスしたことなどが考えられます。
>ShowMessage(grp[1].Value + grp[2].Value); // (1)
これはgrp[1],grp[2]ではなくgrp[0],grp[1]だということはないでしょうか。
動作確認はしていないので、検討ちがいであればすみません。
MLホームページ: http://www.freeml.com/delphi-users
----------------------------------------------------------------------
【おしゃれ泥棒】学園祭イベント実施中♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=h7ZaR
実際のコードで確かめずに検討違いのレスをしたようですみません。
動作して確認するとgrp[0]にはマッチした全体の文字列、grp[1],grp[2]に各グループ
が入っていました。
+で加算すると確かに例外が発生します。
下記のようにいったん別の変数に代入すると、例外が発生しなくなりました。
これが仕様なのかどうかは分かりませんが、 TGroup.Value
は元々のアドレスが割り当てられて、+
で加算してもメモリの再割当が行われないようです。
恐らく、マッチした結果は読み取り専用として処理すべきであって、取得した結果の文
字列に直接書き込むべきではないということだと思います。
procedure TForm1.Button1Click(Sender: TObject);
var
Matches: TMatchCollection;
grp: TGroupCollection;
a: string;
b: string;
begin
Matches := TRegEx.Matches('12.A', '^(¥d+)¥.(¥w+)$');
if Matches.Count = 1 then
begin
grp := Matches[0].Groups;
a := grp[1].Value;
b := grp[2].Value;
ShowMessage(a + b);
//ShowMessage(grp[1].Value + grp[2].Value); // (1)
//ShowMessage(grp[1].Value + '' + grp[2].Value); // (2)
//ShowMessage(Format('%s%s', [grp[1].Value, grp[2].Value])); // (3)
end;
end;
MLホームページ: http://www.freeml.com/delphi-users
----------------------------------------------------------------------
【わグルま!】キョンシーを捕まえよう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=h8kKs