程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> RegularExpressions(4) RegularExpressions 成員(一)

RegularExpressions(4) RegularExpressions 成員(一)

編輯:Delphi

 主要成員有: 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 了.


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved