是DIRegEx正则表达控件,下了一个DEMO的源码,但都好复杂,有没示例的代码,简单点的,只要实现:文本文件的正则,并按行显示出结果即可.我折腾了快一个星期了..路过的帮看看,谢了..下面是我修改后的代码,为什么出不来结果?我不需要指指针的,只要能按行显示出结果就行了,长度,位置之类的也不要..那个ListView改成Memo显示结果就行,越简单越好..大家帮看看..unit MatchTest;{$I DI.inc}interfaceuses
  DISystemCompat, Classes, Controls, Forms, StdCtrls, ComCtrls, ExtCtrls,
  DIRegEx;type
  TMatchTestForm = class(TForm)
    ListView: TListView;
    pnlTop: TPanel;
    lblFileName: TLabel;
    Label1: TLabel;
    btnBrowse: TButton;
    edtFileName: TEdit;
    cbxContentType: TComboBox;
    lblSearchPattern: TLabel;
    btnFindAll: TButton;
    pnlBottom: TPanel;
    ProgressBar: TProgressBar;
    cbxMatchPattern: TEdit;    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);    procedure ListView_Data(Sender: TObject; Item: TListItem);
    procedure btnFindAllClick(Sender: TObject);
  private
    FFileSize: Int64;
    FMatchItems: TList;
    FRegEx: TDIRegExSearchStream;
    FStream: TStream;
    procedure OnRegEx_Progress(
      const ASender: TDICustomRegExSearch;
      const AProgress: Int64;
      var AAbort: Boolean);    procedure GetMatchList;
    procedure ClearMatchItems;
  protected
    function DoSearchInit: Boolean;
    function DoSearchNext: Boolean;
  end;var
  MatchTestForm: TMatchTestForm;
  Filename,FileType,RegMatch:string;implementationuses
  Windows, SysUtils, Graphics, Dialogs,
  DIUtils, DIRegEx_Api, DIRegEx_SearchStream; //后面是2个库,不可删除{$R *.dfm}type
  TMatchItem = record
    ByteStart: Int64;
    ByteLength: Int64;
    CharStart: Int64;
    CharLength: Int64;
    MatchedStr: string;
  end;
  PMatchItem = ^TMatchItem;  TContentType = record
    Name: string;
    ReClass: TDIRegExSearchStreamClass;
  end;//要查询的文本类型
const
  CONTENT_TYPES: array[0..1] of TContentType = (
    (Name: 'UTF-8 (for UTF-8 text)'; ReClass: TDIRegExSearchStream_Utf8),
    (Name: 'ANSI (for text in the user''s locale)'; ReClass: TDIRegExSearchStream_ANSI)
    );//初始化
procedure TMatchTestForm.FormCreate(Sender: TObject);
var
    i:Integer;
begin
  //取得文件路径
  Filename:= ExtractFileName(ParamStr(0));
  FileType:= CONTENT_TYPES[1].Name;
  RegMatch:= cbxMatchPattern.Text;    for i := Low(CONTENT_TYPES) to High(CONTENT_TYPES) do
    cbxContentType.Items.Add(CONTENT_TYPES[i].Name);
  cbxContentType.ItemIndex := 1;
  
  //初始化建立列表
  FMatchItems := TList.Create;
end;//------------------------------------------------------------------------------
//初始化正则搜索
function TMatchTestForm.DoSearchInit: Boolean;
var
  CT: Integer; // Content Type
  MP: RawByteString; // Match Pattern
begin
  {释放旧对象}
  FRegEx.Free;
  FStream.Free;  {打开文件并读入内存}
  FStream := TFileStream.Create(Filename, fmOpenRead or fmShareDenyWrite);
  FFileSize := FStream.Size;  {建立正则对象,并确定类型 }
  CT := cbxContentType.ItemIndex;
  FRegEx := CONTENT_TYPES[CT].ReClass.Create({$IFNDEF DI_No_RegEx_Component}(nil){$ENDIF});
  FRegEx.WorkSpaceSize := 512; // 限制单文件最大的结果匹配数量.
  FRegEx.OnProgress := OnRegEx_Progress; //将进程传给FRegEx  { 编译正则,如果是UTF8则转换 *不可去除*} 
  if coUtf8 in FRegEx.CompileOptions then
    MP := Utf8Encode(cbxMatchPattern.Text)
  else
    MP := RawByteString(cbxMatchPattern.Text); 
    
  Result := FRegEx.CompileMatchPatternStr(MP);  ShowMessage(mp);
  {初始化搜索 }
  FRegEx.SearchInit(FStream);  {初始化进度条}
  ProgressBar.Position := 0;  {UTF8的判断代码,*不可去除*}
  FRegEx.CompileOptions;  {清除旧结果 
  ListView.Items.Clear;
  ClearMatchItems;}
end;//------------------------------------------------------------------------------
//正则搜索核心代码 ,查找到结果后继续下一个...
function TMatchTestForm.DoSearchNext: Boolean;
var
  ByteStart, ByteLength, CharStart, CharLength: Int64;
  MatchItem: PMatchItem;
begin
  Result := Assigned(FRegEx) and (FRegEx.SearchNext(ByteStart, ByteLength, CharStart, CharLength) >= 0); //如果是搜索并有结果则返回数据  //如果有数据则执行
  if Result then
    begin
      //内存中操作
      MatchItem := AllocMem(SizeOf(MatchItem^));
      FMatchItems.Add(MatchItem);
      MatchItem^.ByteStart := ByteStart;
      MatchItem^.ByteLength := ByteLength;
      MatchItem^.CharStart := CharStart;
      MatchItem^.CharLength := CharLength;
      { 检索匹配的字符串。如果匹配的字符串切断整个内存
        的块,FRegEx.MatchedStr可以只检索部分的结果 }
      if FRegEx.SubStrCount > 0 then
        begin
          if coUtf8 in FRegEx.CompileOptions then
            MatchItem^.MatchedStr := BufDecodeUtf8(FRegEx.MatchedStrPtr, FRegEx.MatchedStrLength)
          else
            MatchItem^.MatchedStr := string(FRegEx.MatchedStr);
          { 如果有结果,则插入到Record中 }
          if Length(MatchItem^.MatchedStr) <> CharLength then
            Insert('PARTIAL: ', MatchItem^.MatchedStr, 1);
        end;
    end;
end;//------------------------------------------------------------------------------
//将处理进度传给控件ProgressBar
procedure TMatchTestForm.OnRegEx_Progress(
  const ASender: TDICustomRegExSearch;
  const AProgress: Int64;
  var AAbort: Boolean);
begin
  if FFileSize = 0 then
    ProgressBar.Position := 100
  else
    ProgressBar.Position := AProgress * 100 div FFileSize;  Application.ProcessMessages;  { Check if ESC key is pressed down. }
  if GetAsyncKeyState(VK_ESCAPE) < 0 then
    AAbort := True;
end;//------------------------------------------------------------------------------
//返回所有结果
procedure TMatchTestForm.GetMatchList;
//var
  //StrAry:TStringList;  
begin  try
    //StrAry:=TStringList.Create;
    if DoSearchInit and DoSearchNext then
      begin
        repeat until not DoSearchNext;
       
      end;
  finally
     //StrAry.Free;  end;
end;//------------------------------------------------------------------------------
//清除所有项目
procedure TMatchTestForm.ClearMatchItems;
var
  i: Integer;
  MatchItem: PMatchItem;
begin
  for i := 0 to FMatchItems.Count - 1 do
    begin
      MatchItem := FMatchItems[i];
      Finalize(MatchItem^);
    end;
  FMatchItems.Clear;
end;//------------------------------------------------------------------------------
//显示搜索到的数据**重要**
procedure TMatchTestForm.ListView_Data(Sender: TObject; Item: TListItem);
var
  MatchItem: PMatchItem;
begin
  if Assigned(Item) then
    begin
      Item.Caption := IntToStr(Item.Index);
      MatchItem := FMatchItems[Item.Index];
      Item.SubItems.Add(IntToStr(MatchItem^.ByteStart));
      Item.SubItems.Add(IntToStr(MatchItem^.ByteLength));
      Item.SubItems.Add(IntToStr(MatchItem^.CharStart));
      Item.SubItems.Add(IntToStr(MatchItem^.CharLength));
      Item.SubItems.Add(MatchItem^.MatchedStr);
    end; 
end;//------------------------------------------------------------------------------
//释放对象
procedure TMatchTestForm.FormDestroy(Sender: TObject);
begin
  ClearMatchItems; 
  FMatchItems.Free;
  FRegEx.Free;
  FStream.Free;
end;procedure TMatchTestForm.btnFindAllClick(Sender: TObject);
begin
    GetMatchList;
end;end.
listview