正則表達式最早是由數學家Stephen Kleene於1956年提出,他是在對自然語言的遞增研究成果的基礎上提出來的。具有完整語法的正則表達式使用 在字符的格式匹配方面上,後來被應用到熔融信息技術領域。
正則表達式並非一門專用語言,但它可用於在一個文件或字符裡查找和替代文本的一種標准。許多程序中都使用了正則表達式,但是作為我常用的編程工具之一的Delphi卻沒有直接提供對正則表達式的支持。郁悶之下,在網上進行了一番搜索研究之後,找到了以下幾種在Delphi中使用正則表達式的方法。
為了清楚的說明問題,我們以下面的例子來描述:
已知網址:http://www.xcolor.cn/page1.htm
求:鏈接中的文件名
正確答案為:page1.htm
方法一 使用微軟ScriptControl控件
1. 編寫一個腳本文件(test.vbs),裡面包含要使用的正則表達式函數
function GetUrlFile(Url)
Set RegObject = New RegExp
With RegObject
.Pattern = "w+.w+(?!.)"
.IgnoreCase = True
.Global = True
End With
Set matchs = RegObject.Execute(Url)
If matchs.Count > 0 Then
For Each Mach in matchs
GetUrlFile=Mach.value
Next
End If
Set RegObject = nothing
end function
2. 下載最新版的"Microsoft(r) Windows(r) Script"
你可以在以下地址找到下載
3 . 安裝Microsoft(r) Windows(r) Script
Visual Basic(r) Script Edition (VBScript.) Version 5.6,
JScript(r) Version 5.6, Windows Script Components,
Windows Script Host 5.6,
Windows Script Runtime Version 5.6.將被安裝到你的系統中
4 .在Delphi中導入MsScript.ocx ,生成TScriptControl控件
5.使用以下代碼調用TScriptControl
procedure TForm1.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;
function TForm1.CallFunction(const FunctionName: string;
const Params: oleVariant): OleVariant;
var
Sarray: PSafeArray;
begin
try
// 轉化為安全數組
Sarray := PSafeArray(TVarData(Params).VArray);
// 調用函數
Result := ScriptControl1.Run(FunctionName, Sarray);
except
on E: Exception do
begin
end;
end;
end;
方法二 使用微軟RegExp
1. 下載並安裝最新版的"Microsoft(r) Windows(r) Script"
2. RegExp包含在vbscript.dll中所以我們必須先注冊regsvr32 vbscript.dll
注(安裝了IE5後默認已經包含該控件)
3.在Delphi中引入"Microsoft VBScript Regular Expressions"
主菜單->Project->Import type library->在列表中選擇"Microsoft VBScript Regular Expressions"
生成TRegExp控件
4.使用以下代碼調用TRegExp控件
procedure TForm1.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;
for i := 0 to Machs.Count - 1 do
begin
Matchs := Machs.Item[i] as Match;
submatch := Matchs.SubMatches as ISubMatches;
memo1.Lines.Add(matchs.Value);
//for j:=0 to submatch.Count -1 do
// memo1.Lines.Add(submatch.Item[j])
end;