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
Seite 3 von 4     123 4      
Stolle58

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

AW: Regex Erläuterungen

  Alt 15. Dez 2024, 09:25
"WZ 123456" oder "12.123.45678" sind dann Falsch, wenn Leerzeichen und Punkt ungültige Zeichen sind.
Reinhold
  Mit Zitat antworten Zitat
sko1

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

AW: Regex Erläuterungen

  Alt 15. Dez 2024, 10:36
Dann brauche ich einen anderen Ansatz, um auch bei komplexen Vorgaben unerlaubte Zeichen zu finden:

Aus der Hilfe:
Matches gibt alle Übereinstimmungen zurück, die im Input-String als eine TMatchCollection-Instanz vorhanden sind

Also wollte ich mit der originalen Regex eine MatchCollection haben und deren Länge auswerten:
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
res.count aber ist immer = 0
Irgendwas mache ich immer noch falsch

Ciao
Stefan
  Mit Zitat antworten Zitat
shebang
Online

Registriert seit: 7. Feb 2020
131 Beiträge
 
Delphi 11 Alexandria
 
#23

AW: Regex Erläuterungen

  Alt 15. Dez 2024, 11:01
Irgendwie drehen wir uns aktuell etwas im Kreis.

Dein Pattern überprüft, ob dein Input exakt der Vorgabe entspricht. Wenn das nicht der Fall ist, dann ist das Ergebnis natürlich leer. Das "^" und "$" am Anfang und Ende des Pattern steht für den Anfang und das Ende deines Inputs.

Wenn du die jedes Zeichen einzeln prüfen willst, dann könntest du das Pattern "[a-zA-Z0-9$%&;\*\+\-\/]" verwenden.
  Mit Zitat antworten Zitat
sko1

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

AW: Regex Erläuterungen

  Alt 15. Dez 2024, 11:10
Du hast schon Recht, ich dreh mich im Keis...
Ich muss doch nur unerlaubte Zeichen in einem String finden die nicht der vorgegebenen Expression entsprechen...

Bei dem einfachen Beispiel kann ich die Expression ja negieren, wie aber bei solchen Konstrukten wie
'^([A-Z]{4}[A-Z]{2}([A-Z0-9]){2}([A-Z0-9]){0,3})$'

Ich hatte nun die Idee den zu untersuchenden Inhalt zeichenweise per Match zu testen bis keine Übereinstimmung mehr vorliegt
also
Zeichen 1 prüfen
Zeichen 1..2 prüfen
Zeichen 1..3 prüfen
Zeichen 1..4 prüfen
usw.
aber auch da schlägt die Längenprüfung zu

Deshalb der Ansatz per Matches in der Hoffnung, dass da aller erlaubten Zeichen enthalten sind (also ohne den Pattern zu negieren) nur funktioniert das so leider nicht!

Es muss dafür doch irgendeine Lösung geben!

Ciao
Stefan
  Mit Zitat antworten Zitat
shebang
Online

Registriert seit: 7. Feb 2020
131 Beiträge
 
Delphi 11 Alexandria
 
#25

AW: Regex Erläuterungen

  Alt 15. Dez 2024, 14: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
25 Beiträge
 
Delphi 11 Alexandria
 
#26

AW: Regex Erläuterungen

  Alt 16. Dez 2024, 11: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 11:25 Uhr)
  Mit Zitat antworten Zitat
Stolle58

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

AW: Regex Erläuterungen

  Alt 16. Dez 2024, 11: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
 
#28

AW: Regex Erläuterungen

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

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

AW: Regex Erläuterungen

  Alt 19. Dez 2024, 09: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
Antwort Antwort
Seite 3 von 4     123 4      


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 09:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz