Martin S. schrieb:
1 | > Ausgangsdatensatz:
|
2 | > VT_Float 32 Bit -- Inductance (Henry) -- read only -- -3
|
3 | >
|
4 | > Soll per Regex zu vier Gruppen werden:
|
5 | >
|
6 | > VT_Float 32 Bit
|
7 | > Inductance (Henry)
|
8 | > read only
|
9 | > -3
|
Die Lösung von Datenlutscher ist natürlich korrekt aber maximal
unhilfreich :)
1 | > ([A-Za-z0-9\s\_\/\(\)]+)*
|
Ja, Regexes können schonmal komplex werden. Du suchst hier alle Gruppen,
die aus einer möglichhst langen Aneinanderreihung von Buchstaben,
Ziffern, Whitespace und einigen Sonderzeichen bestehen. Das "-" lässt Du
aus, konsequenterweise wird es auch bei der -3 nicht als Wortbestandteil
erkannt. Insofern ist schonmal klar, warum diese Regex nicht
funktioniert.
Meine Lösung sieht so aus:
1 | (([^-\s]|-[^-\s]|\s+[^-][^-])*)(\s*--\s*)?
|
Ich suche eine beliebig lange Abfolge von Zeichenketten die eine der
drei folgenden Bedingungen erfüllt:
- es ist ein Zeichen, welches weder ein Whitespace noch ein "-" ist
- es ist ein "-" gefolgt von einem Zeichen welches weder ein
Whitespace noch ein "-" ist
- es ist eine mindestens ein Zeichen lange Folge von Whitespaces plus
zwei weitere Zeichen, die beide kein "-" sein dürfen
Anschließend kann optional ein Separator folgen.
Für die Erkennung Deiner Tokens ist die 1. Gruppe dieses Regex-Ausdrucks
relevant.
Übrigens gibt es auch in dieser etwas ausgebauten Regex noch
corner-Cases bei denen man entscheiden muss ob sie den gewünschten
Texten entsprechen (mindestens ein einsames "-" wird im Moment nicht
erkannt).
Einiges der Komplexität in der Regex kommt daher, dass ich rund um den
Separator beliebig viele Whitespaces erlauben wollte und die nicht in
meinen Wunschtexten einbezogen haben wollte.
Prinzipiell muss man immer überlegen, ob Regex das Mittel der Wahl ist.
Der Vorschlag mit dem "split" ist valide und sinnvoll und kann dem
Problem eher angemessen sein.
Viele Grüße,
Simon