Laden...

Suche in Datei mit RegEx

Erstellt von Maddinel vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.451 Views
Maddinel Themenstarter:in
1.371 Beiträge seit 2004
vor 18 Jahren
Suche in Datei mit RegEx

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!!! 😁
==============================

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Maddinel,

solange der Wert kein Leerzeichen enthält, würde folgendes reichen:

@"(?<key>[\s]+)[:=]?\s*(?<value>.*)$"

herbivore

Maddinel Themenstarter:in
1.371 Beiträge seit 2004
vor 18 Jahren

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!!! 😁
==============================

Maddinel Themenstarter:in
1.371 Beiträge seit 2004
vor 18 Jahren

@herbivore
Wie kann ich deine Lösung denn verwenden?

==============================
Wenn ichs wüsst', würd' ich nicht fragen!!! 😁
==============================

P
939 Beiträge seit 2003
vor 18 Jahren

Ich bin auf folgenden Regex gekommen (quasi der selbe wie der von herbivore):

@"([\s:=]+)\s*[:=]?\s*(.*)$"

Aufbau:

  • Name-Gruppe "([^\s:=]+)": alles bis zum ersten "\s", ":" oder "=" (exklusive).
  • Trennzeichen "\s*[:=]?\s*": "\s", ":" oder "=". "\s" auch mehrfach möglich.
  • Wert-Gruppe "(.*)": egal was, bis Zeilenende.

Der Regex matcht aber ausnahmslos alles, z.B. auch:

  • Name == Wert
  • #das ist ein Kommentar.

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

49.485 Beiträge seit 2005
vor 18 Jahren

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

M
210 Beiträge seit 2005
vor 18 Jahren

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

49.485 Beiträge seit 2005
vor 18 Jahren

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

M
210 Beiträge seit 2005
vor 18 Jahren

Ahhh!

Erleuchtung wurde mir zu Teil!
Vielen Dank, werd es direkt mal testen.

cya

M
210 Beiträge seit 2005
vor 18 Jahren

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?

M
210 Beiträge seit 2005
vor 18 Jahren

Ach ja:

Auch diese Variante hat leider nicht funktioniert:

[.|]|[.^|]$

also den Punkt mit in die eckigen Klammern.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Marcel,

der Punkt ist auf jeden Fall schon mal zuviel.

Gehen sollte:

@"[|]|[^|]$"

oder

@"[|]|[^|]$"

herbivore

M
210 Beiträge seit 2005
vor 18 Jahren

So funktionierts! Nochmal vielen Dank