主要成員有: IRegex、ICapture、IMatch、IMatchCollection、IGroup、IGroupCollection
先看: ICapture; 常用的 IMatch、IGroup 都是從它繼承而來; 作為一個底層接口一般不會被直接使用.
它為 IMatch、IGroup 提供了三個屬性: Index、Length、Value; 還有一個 ToString 方法也是獲取 Value.
IMatchCollection、IGroupCollection 分別是 IMatch、IGroup 的集合.
作為集合都有 Count 屬性和 Items[] 屬性; 它們的 GetEnumerator 方法支持了 for in 循環.
和線程支持相關的三個屬性: IsReadOnly、IsSynchronized、SyncRoot 在當前版本並沒有實現.
另外 IGroupCollection 比 IMatchCollection 多出來一個 ItemsByName[] 屬性, 用於獲取指定名稱的子表達式, 如:
uses RegularExpressions;
procedure TForm1.FormCreate(Sender: TObject);
var
Regex: IRegex;
Match: IMatch;
w,n: string;
begin
Regex := TRegex.Create('(?<Name1>[A-Za-z]+)(?<Name2>\d+)');
Match := Regex.Match('AAA1 BBB2 AA11 BB22 A111 B222 AAAA');
while Match.Success do
begin
w := Match.Groups.ItemsByName['Name1'].Value; { AAA ...}
n := Match.Groups.ItemsByName['Name2'].Value; {1 ...}
ShowMessageFmt('%s, %s', [w, n]);
Match := Match.NextMatch;
end;
end;
IMatchCollection 在當前版本應該盡量少用, 因為有個 bug:
獲取 IMatchCollection 後, 其中的 IMatch 對象不包含子表達式的信息!
假如不需要子表達式的信息, 則可以使用(假如需要可以使用 IMatch.NextMatch 方法, 前面有例子):
uses RegularExpressions;
procedure TForm1.FormCreate(Sender: TObject);
var
Regex: IRegex;
Input, Pattern: string;
MatchCollection: IMatchCollection;
Match: IMatch;
begin
Pattern := '([A-Za-z]+)(\d+)';
Input := 'AAA1 BBB2 AA11 BB22 A111 B222 AAAA';
Regex := TRegex.Create(Pattern);
MatchCollection := Regex.Matches(Input);
for Match in MatchCollection do
begin
ShowMessage(Match.Value);
end;
end;
IMatch 與 IGroup 是兩個重要的對象接口.
IMatch 是表達式匹配的結果;
其 Success 方法表示匹配是否成功;
其 NextMatch 方法是繼續匹配下一個, 並返回下一個 IMatch 對象.
IGroup 表示一個子表達式的匹配結果, 一個 IMatch 中可能會包含若干個 IGroup.
下面程序可遍歷出所有匹配到的子表達式:
uses RegularExpressions;
procedure TForm1.FormCreate(Sender: TObject);
var
Regex: IRegex;
Input, Pattern, str: string;
Match: IMatch;
Group: IGroup;
begin
Pattern := '([A-Za-z]+)(\d+)';
Input := 'AAA1 BBB2 AA11 BB22 A111 B222 AAAA';
Regex := TRegex.Create(Pattern);
Match := Regex.Match(Input);
while Match.Success do
begin
for Group in Match.Groups do
begin
Memo1.Lines.Add(Group.Value);
end;
Match := Match.NextMatch;
end;
end;
說沒了, 只剩 IRegex 了.