2009年5月11日星期一
如何在Delphi中使用正则表达式
正则表达式最早是由数学家StephenKleene于1956年提出,他是在对自然语言的递增研究成果的基础上提出来的。具有完整语法的正则表达式使用在字符的格式匹配方面上,后来被应用到熔融信息技术领域。
正则表达式并非一门专用语言,但它可用于在一个文件或字符里查找和替代文本的一种标准。许多程序中都使用了正则表达式,但是作为我常用的编程工具之一的Delphi却没有直接提供对正则表达式的支持。郁闷之下,在网上进行了一番搜索研究之后,找到了以下几种在Delphi中使用正则表达式的方法。
为了清楚的说明问题,我们以下面的例子来描述:
已知网址:http://www.xcolor.cn/page1.htm
求:链接中的文件名
正确答案为:page1.htm
方法一使用微软ScriptControl控件
1.编写一个脚本文件(test.vbs),里面包含要使用的正则表达式函数
functionGetUrlFile(Url)
SetRegObject=NewRegExp
WithRegObject
.Pattern=\w+\.\w+(?!.)
.IgnoreCase=True
.Global=True
EndWith
Setmatchs=RegObject.Execute(Url)
Ifmatchs.Count0Then
ForEachmachinmatchs
GetUrlFile=mach.value
Next
EndIf
SetRegObject=nothing
endfunction
2.下载最新版的Microsoft(r)Windows(r)Script
你可以在以下地址找到下载
3.安装Microsoft(r)Windows(r)Script
VisualBasic(r)ScriptEdition(VBScript.)Version5.6,
JScript(r)Version5.6,WindowsScriptComponents,
WindowsScriptHost5.6,
WindowsScriptRuntimeVersion5.6.将被安装到你的系统中
4.在Delphi中导入MsScript.ocx,生成TScriptControl控件
5.使用以下代码调用TScriptControl
procedureTForm1.Button2Click(Sender:TObject);
var
a:OleVariant;
begin
memo2.Lines.LoadFromFile('test.vbs');
ScriptControl1.Language:='Vbscript';
ScriptControl1.AddCode(string(memo2.Text));
a:=VarArrayCreate([0,0],varVariant);
a[0]:='http://www.xolor.cn/page1.htm';
memo1.Lines.Add(CallFunction('GetUrlFile',a));
end;
functionTForm1.CallFunction(constFunctionName:string;
constParams:oleVariant):OleVariant;
var
Sarray:PSafeArray;
begin
try
//转化为安全数组
Sarray:=PSafeArray(TVarData(Params).VArray);
//调用函数
Result:=ScriptControl1.Run(FunctionName,Sarray);
except
onE:Exceptiondo
begin
end;
end;
end;
方法二使用微软RegExp
1.下载并安装最新版的Microsoft(r)Windows(r)Script
2.RegExp包含在vbscript.dll中所以我们必须先注册regsvr32vbscript.dll
注(安装了Ie5后默认已经包含该控件)
3.在Delphi中引入MicrosoftVBScriptRegularExpressions
主菜单-Project-Importtypelibrary-在列表中选择MicrosoftVBScriptRegularExpressions
生成TRegExp控件
4.使用以下代码调用TRegExp控件
procedureTForm1.Button1Click(Sender:TObject);
var
machs:IMatchCollection;
Matchs:Match;
submatch:ISubMatches;
i,j:integer;
begin
RegExp1.Global:=true;
RegExp1.Pattern:='\w+\.\w+(?!.)';
RegExp1.IgnoreCase:=true;
machs:=RegExp1.Execute('http://www.xcolor.cn/dd/page1.htm')as
IMatchCollection;
fori:=0tomachs.Count-1do
begin
Matchs:=machs.Item[i]asMatch;
submatch:=Matchs.SubMatchesasISubMatches;
memo1.Lines.Add(matchs.Value);
//forj:=0tosubmatch.Count-1do
//memo1.Lines.Add(submatch.Item[j])
end;
end;
订阅:
博文评论 (Atom)
0 评论:
发表评论