Hi,
ich möchte mit Hilfe der Regex-Klasse Werte in einer Text-Datei auslesen können.
Die Werte stehen in etwa so in den Dateien:
Wert1: 234.8
Wert2: 78 (T1 : 43.4 C)
oder auch mit (=)
Wert1= 234.8
Wert2= 78 (T1 : 43.4 C)
oder ohne alles
Wert1 234.8
Wert2 78 (T1 : 43.4 C)
Man übergibt bisher an meine Klasse, die das erledigen soll den Namen also z.B. Wert1 und die Klasse soll den dahinterstehen Wert zurückgeben. Das Problem ist jetzt, das diese Formate nicht immer genau gleich sind.
Wie könnte ich das realisieren, das er weiß, wo der Wert fertig ist?
==============================
Wenn ichs wüsst', würd' ich nicht fragen!!! 😁
==============================
Hallo Maddinel,
solange der Wert kein Leerzeichen enthält, würde folgendes reichen:
@"(?<key>[\s]+)[:=]?\s*(?<value>.*)$"
herbivore
Danke für die Antwort, aber schätze das wird ein Problem, weil soweit ich das sehe, gibt es schon in der Beispieldatei Werte mit Leerzeichen. Darin enthalten ist also der Zahlenwert, aber auch diese Klammern dahinter.
==============================
Wenn ichs wüsst', würd' ich nicht fragen!!! 😁
==============================
@herbivore
Wie kann ich deine Lösung denn verwenden?
==============================
Wenn ichs wüsst', würd' ich nicht fragen!!! 😁
==============================
Ich bin auf folgenden Regex gekommen (quasi der selbe wie der von herbivore):
@"([\s:=]+)\s*[:=]?\s*(.*)$"
Aufbau:
Der Regex matcht aber ausnahmslos alles, z.B. auch:
Die Textdatei darf also nur gültige Name-Werte-Paare enthalten. Das Problem ist, dass "\s" als Trennzeichen zwischen Name und Wert erlaubt ist und dass Trennzeichen auch im Wert vorkommen dürfen. Der exakt matchende Regex dürfte komplizierter und stark in die Länge gezogen ausfallen.
Gruss
Pulpapex
Hallo Maddinel,
Wie kann ich deine Lösung denn verwenden?
Meinst du Regex.Match? Und dann per Groups-Eigenschaft auf "key" und "value" zugreifen?
herbivore
Ich hab diesen Thread nochmal ausgekramt, weil ich dazu ne Frage habe:
Hin und wieder bekomme ich die Fehlermeldung:
parsing "pattern" - Quantifier {x,y} following nothing
Was bedeutet das?
Ich habe als pattern zum Beispiel | eingegeben. Also durch ein Pipe getrennte Zeichen.
Wenn ich ^|$ eingebe kommt die Fehlermeldung nicht aber es funzt auch nicht.
Meine Testdaten sind etwa so:
Tim|Tailor
Georg|Cloony
Jean Claude|van Damme
...
Sind die Regulären Ausdrücke immer gleich oder unterscheiden sie sich auf verschiedenen Betriebssystemen oder unterschiedlichen Programmiersprachen?
Kennt jemand eine gute Website um Reguläre Ausdrücke testen zu können oder eine möglichst vollständige Liste für C#.NET(Regex-Klasse)
Danke
Hallo Marcel,
dein Pattern muss lauten: @"^.|.$"
RegEx haben eine andere Syntax als Suchmuster für Dateien. Hier der DOS-Klassiker: dir .
Ansonsten sind die Basics systemübergreifend gleich (Ausnahmen bestätigen die Regel).
Empfehlungen für Regex-Web-Seiten gab es schon in mehreren Threads: Forumssuche.
Noch mal zu dem Pattern oben: . bedeutet ein beliebiges Zeichen und * bedeutet, dass das Zeichen vor dem Stern beliebig oft wiederholt auftreten darf. .* passt also auf beliebig viele beliebige Zeichen.
herbivore
Ahhh!
Erleuchtung wurde mir zu Teil!
Vielen Dank, werd es direkt mal testen.
cya
Das funktioniert soweit gut.
Jetzt ist mir aufgefallen, dass vor und nach den Pipes beliebige Zeichen sein dürfen, ALLERDINGS KEIN WEITERES PIPE.
Beispiel
Tim|Tailor
Juli|Brown
Georg|Cloony|Schauspieler
Gregory|Greg
wenn der Reguläre Ausdruck: ^.|.$
angewendet wird erkennt er alle vier Zeilen als Treffer
Zeile 3 soll aber kein Treffer sein!
Also dchte ich mit etwa: "Suche zwischen den Pipes nach beliebig vielen beliebigen Zeichen, AUSSER EINEM PIPE"
Also: .[|]|.[^|]$
Zweimal extra eingesetze [^|] sollten entsprechende Pipes ausschließen.
Leider klappt das nicht.
Kann jemand helfen? Wie lautet der korrekte reg. Ausdruck?
Ach ja:
Auch diese Variante hat leider nicht funktioniert:
[.|]|[.^|]$
also den Punkt mit in die eckigen Klammern.
Hallo Marcel,
der Punkt ist auf jeden Fall schon mal zuviel.
Gehen sollte:
@"[|]|[^|]$"
oder
@"[|]|[^|]$"
herbivore