我在RegexBuddy中構建了一個匹配模式,其行爲與我預期的完全相同。但是我不能將它傳輸到Delphi XE,至少在使用最新內置的TRegEx或TPerlRegEx時。正則表達式在Delphi中命名捕獲組XE
我的現實世界的代碼有6個捕獲組,但我可以用一個更簡單的例子來說明問題。該代碼在第一個對話框中給出「3」,然後在執行第二個對話框時引發異常(-7索引超出範圍)。
var
Regex: TRegEx;
M: TMatch;
begin
Regex := TRegEx.Create('(?P<time>\d{1,2}:\d{1,2})(?P<judge>.{1,3})');
M := Regex.Match('00:00 X1 90 55KENNY BENNY');
ShowMessage(IntToStr(M.Groups.Count));
ShowMessage(M.Groups['time'].Value);
end;
但是,如果我只用一個捕獲組
Regex := TRegEx.Create('(?P<time>\d{1,2}:\d{1,2})');
第一個對話框顯示「2」,第二個對話框將顯示時間「00:00」作爲預期。
但是,如果只允許一個命名的捕獲組,那麼這會有點限制,但事實並非如此......如果我將捕獲組名稱更改爲例如「atime」。
var
Regex: TRegEx;
M: TMatch;
begin
Regex := TRegEx.Create('(?P<atime>\d{1,2}:\d{1,2})(?P<judge>.{1,3})');
M := Regex.Match('00:00 X1 90 55KENNY BENNY');
ShowMessage(IntToStr(M.Groups.Count));
ShowMessage(M.Groups['atime'].Value);
end;
正如預期的那樣,我會得到「3」和「00:00」。是否有保留字我不能使用?我不這麼認爲,因爲在我的真實例子中,我嘗試了完全隨機的名字。我只是不知道是什麼原因導致了這種行爲。
你應當QC,報告爲這顯然是一個錯誤。 – jachguate 2011-03-16 16:16:34