Regex, das CSV-Strings validiert

8

Ich habe ein TextField in javaFX, wo sich die Hintergrundfarbe entsprechend ändert, wenn der Inhalt gültig ist oder nicht.

Gültig:

%Vor%

Ungültig:

%Vor%

Grundsätzlich:

  • Nur Ziffern
  • Erste Gruppe 4 oder 9 Ziffern
  • Wenn die erste Gruppe 9 Ziffern - & gt; nur zwei Gruppen insgesamt
  • Wenn die erste Gruppe 4 Ziffern - & gt; drei, vier oder fünf Gruppen insgesamt
  • Gruppiere zwei und drei Ziffern 1-9999
  • Gruppe vier und fünf Ziffern 0-9999

Denken Sie nun eine dieser (gültigen) Zeilen als ein "Ident".

Die aktuelle Regex ist:

%Vor%

Wich funktioniert bisher super, aber jetzt möchte ich csv einbeziehen. So kann ich nur eine Ident eingeben, wie ich es gewohnt bin, oder mehrere Idents getrennt durch Komma (,), aber nicht mehr als fünf Idents insgesamt.

Mein Versuch:

%Vor%

Damit kann ich folgendes eingeben:

  • Alle gültigen Zeilen oben
  • 0101 9 1, 0101 9 2, 0101 9 3
  • 0101 9 1, 987654321 21, 0101 9 3, 0101 9 4

Und wenn ich mehr als 5 IDs eingib, wird es falsch ungültig. Aber wenn ich die ungültige ID eingeben 0101 9 1 1 1 1 1 1 1 1 1 wird es immer noch gültig.

Irgendwelche Vorschläge? :)

EDIT: Dies ist die passende Logik:

%Vor%     
Olav Gulbrandsen Blaaflat 17.11.2015, 12:44
quelle

5 Antworten

3

Das Komma in Ihrer Regexp ist optional , dass "0101 9 1 1 1 1 1 1 1 1 1" als zwei oder mehr Datensätze frei geparst werden kann.

Um dies zu beheben, können Sie entweder genau eine ID oder mehrere durch Kommas getrennte IDs angeben:

%Vor%

Ich würde auch empfehlen, base selbst strenger in Bezug auf Ihre Eingabebedingungen zu machen, obwohl es für das Problem nicht direkt relevant zu sein scheint.

    
AndreyS Scherbakov 17.11.2015, 13:25
quelle
1

Lass uns die Dinge auflösen:

  • Nur Ziffern:

    Der reguläre Ausdruck muss Ziffern und Leerzeichen entsprechen und ^$ verwenden, um nur diesen

    zu entsprechen
  • Erste Gruppe 4 oder 9 Ziffern:

    Straigh vorwärts: \d{4}|\d{9}

  • Wenn die erste Gruppe 9 Ziffern - & gt; nur zwei Gruppen insgesamt

    \d{9}\s\d die 9-stellige Gruppe und die zweite

  • Wenn die erste Gruppe 4 Ziffern - & gt; insgesamt drei, vier oder fünf Gruppen.

    \d{4}(\s\d){2,4} die 4-stellige Gruppe gefolgt von 2 bis 4-Gruppe

  • Gruppiere zwei und drei Ziffern 1-9999

    1-9999 - & gt; [1-9]\d{0,3}

  • Gruppe vier und fünf Ziffern 0-9999

    Einfach eins ... \d{1,4}

Dann kombiniert alles:

%Vor%

Was gibt:

%Vor%

Sie können es versuchen leben hier

    
Cyrbil 17.11.2015 13:32
quelle
1

Hier ist eine Lösung für Ihr Problem. Ich habe die Regex ein wenig modifiziert. Ihr Muster hat auch irgendwie die letzte ungültige Aussage gültig gemacht, zumindest für mich. Das grundlegende Problem, das Sie bekommen, ist, dass Ihre Regex nicht von Klammern umgeben ist. Sie fügen also nur ,?\s zur letzten Anweisung und nicht zur vollständigen regex-Anweisung hinzu.

Hier ist eine modifizierte Lösung, die ich gefunden habe, die alles zu validieren scheint, wie es sein sollte.

%Vor%     
SomeJavaGuy 17.11.2015 13:17
quelle
1

Ich glaube, dass diese Regex alle Ihre Anforderungen erfüllen:

%Vor%

Sie können es hier ausprobieren.

    
Aaron 17.11.2015 13:18
quelle
1

Versuchen Sie

%Vor%

SSCCE:

%Vor%     
James_D 17.11.2015 13:43
quelle

Tags und Links