AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Regex Erläuterungen

Ein Thema von sko1 · begonnen am 12. Dez 2024 · letzter Beitrag vom 20. Dez 2024
Antwort Antwort
shebang

Registriert seit: 7. Feb 2020
144 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Regex Erläuterungen

  Alt 15. Dez 2024, 13:32
Es muss dafür doch irgendeine Lösung geben!
Ok, dann gib uns bitte nochmal ein ganz konkretes Beispiel für einen Input und was exakt du dann als Output von Matches haben möchtest.
  Mit Zitat antworten Zitat
Stolle58

Registriert seit: 4. Aug 2023
Ort: Frankfurt
32 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Regex Erläuterungen

  Alt 16. Dez 2024, 10:16
[QUOTE=sko1;1544226]D
Delphi-Quellcode:
var
  res: TMatchcollection;
begin
  // Pattern ist '^[a-zA-Z0-9$%&;\*\+\-/]{1,36}$'
  res := TRegEx.Matches(AttributInhalt, pattern);
  if res.count <> Length(Attributinhalt) then
   ...
  begin
Wie ist AttributInhalt deklariert?

Mit dem Pattern '^[a-zA-Z0-9$%&;\*\+\-/]{1,36}$' kannst du nur eine Zeile prüfen.
Für einen größeren Text ist das Pattern Ungeeignet.

z.B.:
Code:
'WZ123456'
'1211234542' // Ergebnis Pattern gefunden res = 2
'WZ123456 1211234542' // Ergebnis Pattern nicht gefunden res = 0
PS.
Pattern - '^[a-zA-Z0-9$%&;\*\+\-/]{1,36}$'
sollte '^[a-zA-Z0-9$%&;\*\+\-\/]{1,36}$' so aussehen.
Beim letzte Slash muß ein Backslsh vorran gestellt werden.
Reinhold

Geändert von Stolle58 (16. Dez 2024 um 10:25 Uhr)
  Mit Zitat antworten Zitat
Stolle58

Registriert seit: 4. Aug 2023
Ort: Frankfurt
32 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Regex Erläuterungen

  Alt 16. Dez 2024, 10:27
[QUOTE=sko1;1544226]D
Delphi-Quellcode:
var
  res: TMatchcollection;
begin
  // Pattern ist '^[a-zA-Z0-9$%&;\*\+\-/]{1,36}$'
  res := TRegEx.Matches(AttributInhalt, pattern);
  if res.count <> Length(Attributinhalt) then
   ...
  begin
Wie ist AttributInhalt deklariert?

Mit dem Pattern '^[a-zA-Z0-9$%&;\*\+\-/]{1,36}$' kannst du nur eine Zeile prüfen.
Für einen größeren Text ist das Pattern Ungeeignet.

z.B.:
Code:
'WZ123456'
'1211234542' // Ergebnis Pattern gefunden res = 2

'WZ123456 1211234542' // Ergebnis Pattern nicht gefunden res = 0
Reinhold
  Mit Zitat antworten Zitat
sko1

Registriert seit: 27. Jan 2017
601 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: Regex Erläuterungen

  Alt 19. Dez 2024, 07:53
Hallo,

nach Tagen vergeblicher Versuche frage ich hoch mal anhand eines ganz konkreten Beispiels:

Pattern = '^([A-Z]{2}\d\d([A-Za-z0-9]){11,30})$'
Ich interpretiere das so;
2 Zeichen A...Z
2 Ziffern
11-36 Zeichen A...Za...z0...9

Damit sollte 'AA11abcdefghijkl' gültig sein?
Als Input kommt aber z.B. 'AA11abcdefghij' dann sind alle Zeichen gültig, aber der letzte Teil zu kurz
Als Input kommt aber z.B. 'Ax11abcdefghijkl' dann ist das zweite Zeichen falsch
Wie macht man nun dem Anwender ersichtlich, wo er Eingabefehler hat?

Ciao
Stefan
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.171 Beiträge
 
Delphi 12 Athens
 
#5

AW: Regex Erläuterungen

  Alt 19. Dez 2024, 08: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
sko1

Registriert seit: 27. Jan 2017
601 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: Regex Erläuterungen

  Alt 19. Dez 2024, 08:30
Danke für das Beispiel!

Ich habe allerdings ca. 20 verschiedene Patterns (DATEV Vorgaben) und wenn ich so wie in Deinem Beispiel vorgehe müsste ich für jedes einzelne dann so etwas zusammenbasteln...

Gibt es da nicht irgendwas "allgemen verwndbares"?

Delphi-Quellcode:
      // 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'').');
Wenn Input länger als die ersten beiden Zeichen ist, wird IsMatch da schon Fehler werfen weil es mehr als 2 Zeichen für '^[A-Z]{2}' sind , oder?

Ciao
Stefan
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.171 Beiträge
 
Delphi 12 Athens
 
#7

AW: Regex Erläuterungen

  Alt 19. Dez 2024, 09:47
Es gibt die Named Matched Subexpressions, was aber Delphi meine ich nicht unterstützt.
https://learn.microsoft.com/en-us/do...ar-expressions

Zitat:
Named matched subexpressions

The following grouping construct captures a matched subexpression and lets you access it by name or by number:

(?<name>subexpression)

or:

(?'name'subexpression)
Damit kann man zwar Gruppieren, aber ob es den Status der Gruppen irgendwie zurückgeben kann weiss ich auch nicht.
Das ist vielleicht je nach Implementierung verschieden.
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.998 Beiträge
 
Delphi 12 Athens
 
#8

AW: Regex Erläuterungen

  Alt 19. Dez 2024, 16:39
Bei aller Liebe
wäre es nicht einfacher
20 Prüfroutinen zu schreiben also 20 Regexen zu programmieren, vor allem da Regexen sich meist sehr schlecht überprüfen lassen, man versteht die ja in der Regel nicht wenn man sie anguckt, sondern nur in dem Moment wo man sie baut.

Ich habe auch den Eindruck dass OP gar nicht so vertraut mit Regexen ist als dass er in einem Monat mit einem Blick auf eine Regex sagen könnte was diese Regex macht.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz