He creado un patrón de coincidencia en RegexBuddy que se comporta exactamente como esperaba. Pero no puedo transferir esto a Delphi XE, al menos cuando uso la última versión incorporada en TRegEx o TPerlRegEx.Regex llamado grupos de captura en Delphi XE
Mi código de mundo real tiene 6 grupos de captura, pero puedo ilustrar el problema en un ejemplo más fácil. Este código da "3" en el primer diálogo y luego genera una excepción (-7 índice fuera de límites) cuando se ejecuta el segundo diálogo.
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;
Pero si uso un solo grupo de captura
Regex := TRegEx.Create('(?P<time>\d{1,2}:\d{1,2})');
La primera muestra de diálogo "2" y el segundo diálogo mostrará el tiempo "00:00" como se esperaba.
Sin embargo, esto sería un poco limitante si solo se permitiera un grupo de captura con nombre, pero no es el caso ... Si cambio el nombre del grupo de captura a, por ejemplo, "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;
Voy a obtener "3" y "00:00", tal como esperaba. ¿Hay palabras reservadas que no puedo usar? No lo creo, porque en mi verdadero ejemplo probé nombres completamente aleatorios. Simplemente no puedo entender qué causa este comportamiento.
debe informar esto en QC, ya que esto es obviamente un error. – jachguate