Regex benannte Erfassungsgruppen in Delphi XE

8

Ich habe in RegexBuddy ein Match-Muster erstellt, das sich genau so verhält, wie ich es erwarte. Aber ich kann dies nicht auf Delphi XE übertragen, zumindest nicht mit den neuesten eingebauten TRegEx oder TPerlRegEx.

Mein realer Code hat 6 Capture-Gruppen, aber ich kann das Problem in einem einfacheren Beispiel veranschaulichen. Dieser Code gibt "3" im ersten Dialog und löst dann eine Ausnahme aus (-7 Index außerhalb der Grenzen), wenn das zweite Dialogfeld ausgeführt wird.

%Vor%

Aber wenn ich nur eine Capture-Gruppe verwende

%Vor%

Der erste Dialog zeigt "2" und der zweite Dialog zeigt wie erwartet die Zeit "00:00".

Allerdings wäre dies ein wenig einschränkend, wenn nur eine benannte Erfassungsgruppe erlaubt wäre, aber das ist nicht der Fall ... Wenn ich den Namen der Erfassungsgruppe beispielsweise in "atime" ändere.

%Vor%

Ich bekomme "3" und "00:00", genau wie erwartet. Gibt es reservierte Wörter, die ich nicht benutzen kann? Ich denke nicht, weil ich in meinem realen Beispiel völlig zufällige Namen ausprobiert habe. Ich kann einfach nicht herausfinden, was dieses Verhalten verursacht.

    
Stefan Fjellsten 16.03.2011, 08:45
quelle

2 Antworten

7

Wenn pcre_get_stringnumber den Namen nicht findet, wird PCRE_ERROR_NOSUBSTRING zurückgegeben.

PCRE_ERROR_NOSUBSTRING ist in RegularExpressionsAPI als PCRE_ERROR_NOSUBSTRING = -7 definiert.

Einige Tests zeigen, dass pcre_get_stringnumber PCRE_ERROR_NOSUBSTRING für jeden Namen zurückgibt, der den ersten Buchstaben im Bereich von k bis z hat und dieser Bereich vom ersten Buchstaben in judge abhängig ist. Wenn Sie judge auf etwas anderes ändern, ändert sich der Bereich.

Wie ich sehe, sind hier mindestens zwei Fehler beteiligt. Eins in pcre_get_stringnumber und eins in TGroupCollection.GetItem, das eine richtige Ausnahme anstelle von SRegExIndexOutOfBounds

auslösen muss     
Mikael Eriksson 16.03.2011, 10:09
quelle
5

Der Fehler scheint in der Unit RegularExpressionsAPI zu liegen, die die PCRE-Bibliothek oder die PCRE-OBJ-Dateien, die sie verbindet, umschließt. Wenn ich diesen Code ausführe:

%Vor%

Es druckt -7 und 2 statt 1 und 2.

Wenn ich RegularExpressionsAPI aus der uses -Klausel entferne und die pcre -Einheit aus meiner TPerlRegEx-Komponente hinzufüge , dann druckt es richtig 1 und 2.

Das RegularExpressionsAPI in Delphi XE basiert auf meiner pcre Einheit, und die RegularExpressionsCore Einheit basiert auf meiner PerlRegEx Einheit. Embarcadero hat einige Änderungen an beiden Einheiten vorgenommen. Sie haben auch ihre eigenen OBJ-Dateien aus der PCRE-Bibliothek kompiliert, die durch RegularExpressionsAPI verknüpft sind.

Ich habe diesen Fehler als QC 92497

gemeldet

Ich habe auch einen separaten Bericht QC 92498 erstellt, um zu beantragen, dass TGroupCollection.GetItem raise a sinnvollere Ausnahme beim Anfordern einer benannten Gruppe, die nicht existiert. (Dieser Code ist in der RegularExpressions -Einheit, die auf Code basiert, der von Vincent Parrett geschrieben wurde, nicht von mir selbst.)

    
Jan Goyvaerts 23.03.2011 03:25
quelle

Tags und Links