首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

高手帮忙-DIRegEx控件的简单用法

2013-04-07 
高手帮忙------求一个DIRegEx控件的简单用法是DIRegEx正则表达控件,下了一个DEMO的源码,但都好复杂,有没示

高手帮忙------求一个DIRegEx控件的简单用法
是DIRegEx正则表达控件,下了一个DEMO的源码,但都好复杂,有没示例的代码,简单点的,

只要实现:文本文件的正则,并按行显示出结果即可.

我折腾了快一个星期了..路过的帮看看,谢了..

下面是我修改后的代码,为什么出不来结果?

我不需要指指针的,只要能按行显示出结果就行了,长度,位置之类的也不要..那个ListView改成Memo显示结果就行,

越简单越好..大家帮看看..

unit MatchTest;

{$I DI.inc}

interface

uses
  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;

implementation

uses
  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
[解决办法]
没用过这个控件
万一的博客里讲解了几个正则控件, 不知对你有用不
http://www.cnblogs.com/del/category/113551.html
[解决办法]
我现在用PCRE

热点排行