//IRegex 的屬性與方法
IRegex.GetGroupNames; { 子表達式編號數組, 譬如有兩個子表達式, 會得到 0,1,2; 這基本無用 }
IRegex.GetGroupNumbers; { 同上, 只是獲取的是整數數組 }
IRegex.GroupNameFromNumber(); { 應該是從子表達式編號獲取子表達式的名稱; 但沒有實現, 來回都是編號 }
IRegex.GroupNumberFromName(); { 同上一個是反著的; 基本都無用 }
IRegex.IsMatch(); { 判斷是否有所匹配; 如果只想知道是否匹配到, 用它應該最快 }
IRegex.Match(); { 獲取一個 IMatch 對象, 這是第一個匹配結果 }
IRegex.Matches(); { 獲取一個 IMatchCollection 對象; 這是匹配到的 IMatch 的集合 }
IRegex.Replace(); { 替換 }
IRegex.Split(); { 根據表達式分割字符串; 當前版本沒有實現好, 暫時無用 }
IRegex.ToString; { 獲取表達式文本 }
IRegex.Save(); { 把表達式保存到流 }
IRegex.Load(); { 從流中取回由 Save 保存的表達式 }
IRegex.Options; { 選項集合, 是只讀的; 要設置只能從 Create 方法中 }
{這其中需要重新看看的只有 Replace}
//IRegex 是通過 TRegex 實現的, TRegex 還有下面幾個靜態類方法:
TRegex.Escape(); { 編碼需要轉義的字符 }
TRegex.Unescape(); { 還原 Escape 的編碼 }
TRegex.IsMatch(); { 同 IRegex.IsMatch }
TRegex.Match(); { 同 IRegex.Match }
TRegex.Matches(); { 同 IRegex.Matches }
TRegex.Replace(); { 同 IRegex.Replace }
TRegex.Split(); { 同 IRegex.Split }
{ 使用這些個類方法會讓代碼更簡單 }
下面是使用類方法簡化程序的例子:
uses RegularExpressions;
procedure TForm1.FormCreate(Sender: TObject);
var
Match: IMatch;
MatchCollection: IMatchCollection;
Pattern, Input, str: string;
begin
Pattern := '([A-Za-z]+)(\d+)';
Input := 'AAA1 BBB2 AA11 BB22 A111 B222 AAAA';
//
Match := TRegex.Match(Input, Pattern);
ShowMessage(Match.Value); { AAA1 }
//
MatchCollection := TRegex.Matches(Input, Pattern);
ShowMessage(IntToStr(MatchCollection.Count)); { 4 }
//
str := TRegex.Replace(Input, Pattern, '◆');
ShowMessage(str); { ◆ ◆ ◆ ◆ ◆ ◆ AAAA }
end;
Escape 與 Unescape 測試:
uses RegularExpressions;
procedure TForm1.FormCreate(Sender: TObject);
var
str: string;
begin
str := TRegex.Escape('.$^{[(|)*+?\');
ShowMessage(str); (* \.\$\^\{\[\(\|\)\*\+\?\\ *)
str := TRegex.Unescape(str);
ShowMessage(str); (* .$^{[(|)*+?\ *)
end;
Replace 函數有很多重載, 如:
uses RegularExpressions;
procedure TForm1.FormCreate(Sender: TObject);
var
Regex: IRegex;
Match: IMatch;
Pattern, Input, str: string;
begin
Pattern := '([A-Za-z]+)(\d+)';
Input := 'AAA1 BBB2 AA11 BB22 A111 B222 AAAA';
Regex := TRegex.Create(Pattern);
{ 替換全部 }
str := Regex.Replace(Input, '◆');
ShowMessage(str); { ◆ ◆ ◆ ◆ ◆ ◆ AAAA }
{ 只替換前兩個匹配 }
str := Regex.Replace(Input, '◆', 2);
ShowMessage(str); { ◆ ◆ AA11 BB22 A111 B222 AAAA }
{ 從第 10 個字符開始, 只替換兩個匹配 }
str := Regex.Replace(Input, '◆', 2, 10);
ShowMessage(str); { AAA1 BBB2 ◆ ◆ A111 B222 AAAA }
end;
Replace 函數中還應該有一個 TMatchEvaluator 事件參數, 它可以執行一些更高級的替換, 遺憾的是當前版本也沒有實現.
盡管有不少東西還沒實現, 但試用下來感覺還是蠻不錯的, 可以放棄 PerlRegEx 了!