是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
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
万一的博客里讲解了几个正则控件, 不知对你有用不
http://www.cnblogs.com/del/category/113551.html