Einzelnen Beitrag anzeigen

Rollo62

Registriert seit: 15. Mär 2007
4.116 Beiträge
 
Delphi 12 Athens
 
#29

AW: Regex Erläuterungen

  Alt 19. Dez 2024, 09:18
Du könntest nach einem fehlgeschlagenem RegEx noch die Abschnitte einzeln prüfen.
In etwa so (ungetestet):

Delphi-Quellcode:
function ValidateInputByPosition(Input: string): string;
var
  Match: TMatch;
  Errors: TStringList;
  LengthPart: Integer;
begin
  Errors := TStringList.Create;
  try
    // Vollständige Musterprüfung
    if not TRegEx.IsMatch(Input, '^([A-Z]{2}\d{2}[A-Za-z0-9]{11,30})$') then
    begin
      // Abschnitt 1: Zwei Großbuchstaben
      if not TRegEx.IsMatch(Input, '^[A-Z]{2}') then
        Errors.Add('Die Eingabe muss mit zwei Großbuchstaben beginnen (z. B. ''AA'').');
      
      // Abschnitt 2: Zwei Ziffern
      if not TRegEx.IsMatch(Input, '^[A-Z]{2}\d{2}') then
        Errors.Add('Nach den Großbuchstaben müssen zwei Ziffern folgen (z. B. ''11'').');
      
      // Abschnitt 3: Länge des letzten Teils
      LengthPart := Length(Copy(Input, 5, MaxInt));
      if LengthPart < 11 then
        Errors.Add(Format('Der letzte Teil muss mindestens 11 Zeichen lang sein, aber es sind nur %d Zeichen.', [LengthPart]))
      else if LengthPart > 30 then
        Errors.Add(Format('Der letzte Teil darf maximal 30 Zeichen lang sein, aber es sind %d Zeichen.', [LengthPart]));
    end;

    // Rückgabe
    if Errors.Count = 0 then
      Result := 'Die Eingabe ist gültig.'
    else
      Result := Errors.Text;
  finally
    Errors.Free;
  end;
end;

// Testaufruf
procedure TestValidationByPosition;
var
  Inputs: array[0..3] of string = ('AA11abcdefghijkl', 'AA11abcdefghij', 'Ax11abcdefghijkl', 'AA11abcdefghijklmnopqrstu');
  I: Integer;
begin
  for I := Low(Inputs) to High(Inputs) do
    Writeln(Format('Eingabe: %s', [Inputs[I]]), #13#10, ValidateInputByPosition(Inputs[I]));
end;
  Mit Zitat antworten Zitat