kraemer
Goto Top

Verständnisproblem bei regex

Moin zusammen,

ich muss mich zum ersten mal überhaupt mit regex richtig beschäftigen und hänge dabei vollends. Vielleicht kann mir jemand auf die Sprünge helfen.

Zur Vorgeschichte: Ich muss einem Programmierer für ein Konvertierungsprogramm mitteilen, welche Werte übernommen werden sollen. Ich könnte dies nun, wie ich es auch hier machen werde, mit einfachen Worten beschreiben. Dem Programmierer ist das egal. Das Problem dabei ist nur, das ich dann nur hoffen kann, das er mich richtig versteht. Und das möchte ich mit einer regex sicherstellen. Diese kann ich nämlich vorab prüfen.

Es geht um folgendes: In einer Datenbank gibt es in einem Feld u.a. folgende Werte:

-
1,2 mm
10 x 10 x 8 cm (LxDxH)
10,8 x 2,4 x 2,35 cm
100 x 70 x 150 mm
100 x 90 x 180 mm
105 x 90 x 160 mm
110 x 100 x 90 mm
110 x 190 x 90 mm
110 x 430 x 30 mm
irgend ein Text
120 x 80/160 x 190 mm
130 x 70 x 200 mm
130 x 85 x 28 cm
131 x 275 mm
135 x 60 x 68 mm

Eigentlich sollten in diesem Feld nur Werte Länge X Breite und alternativ X Höhe stehen. Sollten... Es muss nun sicher gestellt werden, das diese Werte beim Import nur angefasst werden, wenn sie passen können.
Dafür wollte ich nun folgende Regel bauen: Zahlen müssen vorhanden sein, die Begriffe cm oder mm müssen vorhanden sein, das x muss mindestens einmal vorhanden sein. Darüber hinaus dürfen keine anderen Zeichen vorhanden sein.

Das ist mein bisheriger Versuch:
([0-9]{1,})([cm]+)([x]+)
Das funktioniert in soweit, das z.B. 1cmx erkannt wird. Leider dürfen dann keine Leerzeichen etc. dazwischen stehen. Und irgendwie überlese ich in z.B. folgendem Tutorial wie man die Bedingungen so verknüpft, das es passt.

Wäre super wenn mir einer bei diesem konkreten Fall helfen kann. Die anderen zig Bedingungen, die ich noch brauchen werde, werde ich mir dann sicherlich selbst zusammen basteln können.

Krämer

Content-Key: 313053

Url: https://administrator.de/contentid/313053

Ausgedruckt am: 28.03.2024 um 18:03 Uhr

Mitglied: Phill93
Lösung Phill93 19.08.2016 um 09:55:34 Uhr
Goto Top
Hallo,

folgender Regex Sollte dir das Richtige Ergebniss liefern:
([\d|,|\/]*)\s?x\s?([\d|,|\/]*)\s?(x\s?([\d|,|\/]*))?\s?(mm|cm)

Was macht der?:

  • Die Erste Gruppe sucht nach Zahlen, Kommas und Schrägstrichen in beliebiger Menge
  • Danach kommen 0 oder mehr (?) Leerzeichen (\s) eine x und wieder 0 oder mehr Leerzeichen
  • Dann Kommt wieder eine Zahlen Gruppe
  • Hier wirds jetzt Kniffelig wir wollen ja alles im Format l x b und l x b x h deshalb brauchen wir wieder eine 0 oder mehrere Konstruktion für die Letzte Gruppe
  • am Schluss kommt noch ein Filter für cm oder mm

Ich hoffe ich konnte helfen

Phill93
Mitglied: Kraemer
Kraemer 19.08.2016 um 10:08:25 Uhr
Goto Top
Hi Phill,

das sieht schon deutlich besser aus - versuche gerade zu begreifen wie das funktioniert.

Leider matcht dieses regex zwei nicht erwünschte Ergebnisse:

120 x 80/160 x 190 mm 
10 x 10 x 8 cm (LxDxH)

Ersteres: 80/160 ist eine ungültige Angabe und damit der Datensatz ungültig
Letzteres: (LxDxH) - da könnte auch Hugo stehen. Sobald das aber der Fall ist ist der Datensatz ungültig.

Hast du dafür auch noch eine Idee?

Krämer
Mitglied: Phill93
Lösung Phill93 19.08.2016 aktualisiert um 10:36:08 Uhr
Goto Top
Zitat von @Kraemer:

Hi Phill,

das sieht schon deutlich besser aus - versuche gerade zu begreifen wie das funktioniert.

Leider matcht dieses regex zwei nicht erwünschte Ergebnisse:

120 x 80/160 x 190 mm 
10 x 10 x 8 cm (LxDxH)
Ersteres: 80/160 ist eine ungültige Angabe und damit der Datensatz ungültig

Hab gedacht das währe so gewollt
Letzteres: (LxDxH) - da könnte auch Hugo stehen. Sobald das aber der Fall ist ist der Datensatz ungültig.
Hast du dafür auch noch eine Idee?

Krämer

Jup hab ich hier der korrigierte Regex

^([\d|,]*)\s?x\s?([\d|,]*)\s?(x\s?([\d|,]*))?\s?(mm|cm)$

Ersteres ist einfach zu lösen einfach die / aus den Eckigen Klammern werfen. Jedoch hat man das Problem das er "120 x 80/160 x 190 mm" als richtige Zeile erkennt weil da drin "160 x 190" steht deshalb sagt man noch das er immer am Zeilen Anfang anfangen soll (^).

Letzteres geht ganz einfach du sagst deinem Parser das nach "l x b x h mm" Schluss sein soll ($)

Gruß
Phill93

Edit: Formatierung gerichtet
Mitglied: Kraemer
Kraemer 19.08.2016 um 10:59:03 Uhr
Goto Top
Abgefahren: Das funktioniert! Vielen Dank dafür und vor allem für deine tollen Erklärungen!

Gruß Krämer
Mitglied: 129813
Lösung 129813 19.08.2016 aktualisiert um 12:05:24 Uhr
Goto Top
Hi,
@Phill93 there are some flaw's in your regex. These strings are also matched:
100,10 x mm
100|,0 x cm
300,0 x 44,|0 mm
so this regex corrects these errors:
^([\d,]+)\s?x\s?([\d,]+)\s?(x\s?[\d,]+\s?)?(mm|cm)$
The pipe(|) symbol inside square brackets matches itself as a symbol, it does not separate the symbols this is only the case inside parenthesis!

Regards
Mitglied: Kraemer
Kraemer 19.08.2016 aktualisiert um 12:00:38 Uhr
Goto Top
Zitat von @129813:
> ^([\d,]+)\s?x\s?([\d,]+)\s?(x\s?[\d,]+)?(mm|cm)$
Thank's a lot for the information. But in your code is a small mistake face-wink . You forgot the last possible space.

^([\d,]+)\s?x\s?([\d,]+)\s?(x\s?[\d,]+)?\s?(mm|cm)

Regards
Mitglied: 129813
129813 19.08.2016 aktualisiert um 12:06:30 Uhr
Goto Top
Yip thanks face-smile but you should place it inside the parenthesis face-wink otherwise two spaces are allowed at the end...corrected above.