在 Delphi 中使用正規表達式, 目前 PerlRegEx 應該是首選, 準備徹底而細緻地研究它.
官方網站: http://www.regular-expressions.info/delphi.html
直接下載下傳: http://www.regular-expressions.info/download/TPerlRegEx.zip
安裝方法:
1、先把解壓的 TPerlRegEx 檔案夾放一個合适的地方, 我放在了 Delphi 的 Imports 目錄中.
2、目前最新 For Win32 的版本是對 Delphi 2006 的, 2007 也能用.
打開 PerlRegExD2006.dpk, 提示缺少資源檔案, 沒關系;
在 Project Manager 視窗中的 PerlRegExD2006.bpl 上點選右鍵, 執行 Install;
這時在 Tool Palette 的清單中已經有了 TPerlRegEx, 在 JGsoft 組.
3、Tools -> Options -> Environment Options -> Delphi Options -> Library-Win32 -> Library path ->
添加路徑: .../Imports/TPerlRegEx
4、可以使用了! 直接 uses PerlRegEx 或從 Tool Palette 添加都可以.
如果不喜歡 Tool Palette 的添加方式可以省略第二步.
計劃的學習步驟: 1、正則文法; 2、TPerlRegEx 功能.
//準備用這段簡單的代碼測試文法:
uses
PerlRegEx; //uses 正規表達式單元
procedure TForm1.FormCreate(Sender: TObject);
var
reg: TPerlRegEx; //聲明正規表達式變量
begin
reg := TPerlRegEx.Create(nil); //建立
reg.Subject := 'sSsS'; //這是要替換的源字元串
reg.RegEx := 's'; //這是表達式, 在這裡是準備替換掉的子串
reg.Replacement := '◆'; //要替換成的新串
reg.ReplaceAll; //執行全部替換
ShowMessage(reg.Subject); //傳回替換結果: ◆S◆S
FreeAndNil(reg); //因為建立時屬主給了 nil, 這裡沒有使用 reg.Free
end;
Delphi 正規表達式文法(1): 關于大小寫與中文 |
Delphi 正規表達式文法(2): 或者與重複 |
Delphi 正規表達式文法(3): 比對範圍
// [A-Z]: 比對所有大寫字母
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := 'CodeGear Delphi 2007 for Win32';
reg.RegEx := '[A-Z]';
reg.Replacement := '◆';
reg.ReplaceAll;
ShowMessage(reg.Subject); //傳回: ◆ode◆ear ◆elphi 2007 for ◆in32
FreeAndNil(reg);
end;
// [a-z]: 比對所有小寫字母
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := 'CodeGear Delphi 2007 for Win32';
reg.RegEx := '[a-z]';
reg.Replacement := '◆';
reg.ReplaceAll;
ShowMessage(reg.Subject); //傳回: C◆◆◆G◆◆◆ D◆◆◆◆◆ 2007 ◆◆◆ W◆◆32
FreeAndNil(reg);
end;
// [0-9]: 比對所有數字
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := 'CodeGear Delphi 2007 for Win32';
reg.RegEx := '[0-9]';
reg.Replacement := '◆';
reg.ReplaceAll;
ShowMessage(reg.Subject); //傳回: CodeGear Delphi ◆◆◆◆ for Win◆◆
FreeAndNil(reg);
end;
//比對幾個範圍
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := 'CodeGear Delphi 2007 for Win32';
reg.RegEx := '[C-Do-p0-2]'; //大寫字母: C-D; 小寫字母: o-p; 數字: 0-2
reg.Replacement := '◆';
reg.ReplaceAll;
ShowMessage(reg.Subject); //傳回: ◆◆deGear ◆el◆hi ◆◆◆7 f◆r Win3◆
FreeAndNil(reg);
end;
//比對 [] 中的所有
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := 'CodeGear Delphi 2007 for Win32';
reg.RegEx := '[Ci2]'; //大寫字母: C; 小寫字母: i; 數字: 2
reg.Replacement := '◆';
reg.ReplaceAll;
ShowMessage(reg.Subject); //傳回: ◆odeGear Delph◆ ◆007 for W◆n3◆
FreeAndNil(reg);
end;
// ^ 排除 [] 中的所有
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := 'CodeGear Delphi 2007 for Win32';
reg.RegEx := '[^Ci0-2]'; //這裡排除了大寫字母: C; 小寫字母: i; 數字: 0-2
reg.Replacement := '◆';
reg.ReplaceAll;
ShowMessage(reg.Subject); //傳回: C◆◆◆◆◆◆◆◆◆◆◆◆◆i◆200◆◆◆◆◆◆◆i◆◆2
FreeAndNil(reg);
end;
Delphi 正規表達式文法(4): 常用轉義字元與 . |
Delphi 正規表達式文法(5): 邊界
// /b 單詞邊界
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := 'Delphi Delphi2007 MyDelphi';
reg.RegEx := '/bDelphi/b'; //前後邊界
reg.Replacement := '◆';
reg.ReplaceAll;
ShowMessage(reg.Subject); //傳回: ◆ Delphi2007 MyDelphi
FreeAndNil(reg);
end;
// /b 單詞邊界: 左邊界
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := 'Delphi Delphi2007 MyDelphi';
reg.RegEx := '/bDelphi'; //左邊界
reg.Replacement := '◆';
reg.ReplaceAll;
ShowMessage(reg.Subject); //傳回: ◆ ◆2007 MyDelphi
FreeAndNil(reg);
end;
// /b 單詞邊界: 右邊界
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := 'Delphi Delphi2007 MyDelphi';
reg.RegEx := 'Delphi/b'; //右邊界
reg.Replacement := '◆';
reg.ReplaceAll;
ShowMessage(reg.Subject); //傳回: ◆ Delphi2007 My◆
FreeAndNil(reg);
end;
// /B 非單詞邊界
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := 'Delphi MyDelphi2007 MyDelphi';
reg.RegEx := '/BDelphi/B'; //現在隻有 MyDelphi2007 中的 Delphi 屬于非單詞邊界
reg.Replacement := '◆';
reg.ReplaceAll;
ShowMessage(reg.Subject); //傳回: Delphi My◆2007 MyDelphi
FreeAndNil(reg);
end;
// ^ 行首
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := 'Delphi Delphi2007 MyDelphi';
reg.RegEx := '^Del'; //比對在行首的 Del
reg.Replacement := '◆';
reg.ReplaceAll;
ShowMessage(reg.Subject); //傳回: ◆phi Delphi2007 MyDelphi
FreeAndNil(reg);
end;
// /A 也标記行首
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := 'Delphi Delphi2007 MyDelphi';
reg.RegEx := '/ADel'; //比對在行首的 Del
reg.Replacement := '◆';
reg.ReplaceAll;
ShowMessage(reg.Subject); //傳回: ◆phi Delphi2007 MyDelphi
FreeAndNil(reg);
end;
// $ 行尾
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := 'Delphi Delphi2007 MyDelphi';
reg.RegEx := 'phi$'; //比對在行尾的 phi
reg.Replacement := '◆';
reg.ReplaceAll;
ShowMessage(reg.Subject); //傳回: Delphi Delphi2007 MyDel◆
FreeAndNil(reg);
end;
// /Z 也标記行尾
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := 'Delphi Delphi2007 MyDelphi';
reg.RegEx := 'phi/Z'; //比對在行尾的 phi
reg.Replacement := '◆';
reg.ReplaceAll;
ShowMessage(reg.Subject); //傳回: Delphi Delphi2007 MyDel◆
FreeAndNil(reg);
end;
// 測試時, /Z 不區分大小寫; /A 區分
Delphi 正規表達式之TPerlRegEx 類的屬性與方法(6): EscapeRegExChars 函數
// EscapeRegExChars 函數可以自動為特殊字元加轉義符号 /
var
reg: TPerlRegEx;
begin
reg := TPerlRegEx.Create(nil);
reg.Subject := 'C++Builer';
reg.RegEx := reg.EscapeRegExChars('C+') + '{2}'; {相當于 'C/+{2}'}
reg.Replacement := '◆';
reg.ReplaceAll;
ShowMessage(reg.Subject); {傳回: ◆Builer}
FreeAndNil(reg);
end;
Delphi 正規表達式之TPerlRegEx 類的屬性與方法(7): Split 函數
//字元串分割: Split
var
reg: TPerlRegEx;
List: TStrings;
begin
List := TStringList.Create;
reg := TPerlRegEx.Create(nil);
reg.Subject := 'aaa,bbb,ccc,ddd';
reg.RegEx := ','; {這裡可是運作相當複雜的分割符啊}
reg.Split(List,MaxInt); {第一個參數讀入的是 Subject; 第二個參數是分成多少份}
{ 輸入一個最大整數, 表示能分多少就分多少}
ShowMessage(List.Text);
{傳回:
aaa
bbb
ccc
ddd
}
FreeAndNil(reg);
List.Free;
end;