PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Nur bestimmte Werte aus Zeichenkette auslesen


creon
01.08.2006, 21:02
Hu :)

Also was regex angeht bin ich ein totaler Anfänger, habe mich aber heute den halben mittag damit beschäftig.

Ich habe da Konfigurationsanweisungen. Eine davon könnte lauten:

set_vcore "1.45"

Wie man sieht, setzt diese sich aus einer Anweisung und einem Wert zusammen.

Jetzt würde ich gerne Anweisung und Wert in einer Variablen speichern, dafür muss ich diese ja aber erstmal mit regex trennen. Schliesslich brauch ich weder Leerzeichen, noch Anführungszeichen, nur das: Anweisung: set_vcore / Wert: 1.45

Ich habe mal etwas rumprobiert und das kam dabei raus:

(\bset_vcore\b)([" ]*)(\b.*\b)
Damit fallen weder Leer- noch Anführungszeichen raus, aber dafür ists getrennt.

Problem: das ganze könnte auch so aussehen:


set_vcore "1.45"
set_vcore "1.45" //ein Haufen Leerzeichen dazwischen
set_vcore 1.45 //keine Anführungszeichen


Wie würdet ihr das nun lösen, das ich nur Anweisung und Wert erhalte, egal in welcher der 3 Formen der String vorliegt?


Danke :)


//edit: Davor und dahinter kann alles Mögliche stehen, es sollten nur die beiden Sachen "rausgepickt" werden.
zb bei 19:11set_vcore 1.45; soll die Uhrzeit und das Semilikon am Ende wegfallen.


Manni the Dark
01.08.2006, 21:59
Probiers mal damit:
/set_vcore\s+(\S+|"[^"]*")/

creon
01.08.2006, 22:08
edit: doch geht danke :D
kenn mich noch nich so gut aus, es funktioniert nur wenn ich die slashes am anfang und ende weglasse, woran liegt das?

Manni the Dark
01.08.2006, 22:26
Das liegt daran, dass du keine Perl Compatible Regular Expressions (Kurz PCRE (http://de.wikipedia.org/wiki/PCRE)) verwendest. Die erfordern nämlich sogar einen soganannten Delimiter (in dem Fall der Slash)

creon
02.08.2006, 14:26
ok danke. funktioniert soweit auch bestens, egal wieviel leerzeichen da sind, das Ergebnis ist immer das gleiche (wie es auch sein soll) :)

Könnte man das mit den Anführungszeichen oder dem Text dahinter auch noch machen? die bleiben beim auslesen des Wertes leider immer erhalten..

mfg

Manni the Dark
02.08.2006, 20:05
/set_vcore\s+(\S+|"([^"])*")/
Der String dahinter sollte eigentlich garnicht erst mitgematcht werden ;)

creon
04.08.2006, 13:58
Danke für deine Mühe, aber außer einer zusätzlichen Gruppe hat sich jetzt ja nichts verändert? :confused:
Habe jetzt eben noch die zusätzliche Gruppe, die aber immer leer ist, und die Anführungszeichen sind nach wie vor da.

mfg

//edit: habe das hier versucht:

(set_vcore)\s+"?(\d*)

funktioniert auch, trotz Anführungszeichen erhalte ich immer nur Anweisung und Wert als Gruppe. Leider kann ich aber dann keine Kommazahl angeben, sprich "1" geht, "11" geht, aber "1.1" geht nicht. Also habe ich das hier versucht:

(set_vcore)\s+"?(\d+\.\d+|\d+)

also noch eine Alternative mit Punkt angegeben. Funktioniert auch.
Zwischenfrage: warum geht das nur mit (\d+\.\d+|\d+), nicht aber mit (\d+|\d+\.\d+)? ist doch nur umgedreht, bei letzterem werden wieder keine Kommazahlen erkannt.

Was hälst du von dieser Variante? funktioniert scheinbar, weiß aber nicht ob das so optimal ist.

//edit: Für negative Werte noch etwas verändert:

(set_vcore)\s+"?(-?\d+\.\d+|-?\d+)

creon
06.08.2006, 18:25
Kein Kommentar :confused:

z3r0x
06.08.2006, 21:21
Ich würds so machen...
Wobei es eigentlich überflüssig ist, set_vcore zu gruppieren.

Wenn die RegEx set_vcore matched, weisst du doch, dass es nur set_vcore sein kann. :p


(set_vcore)\s+"?([0-9.-]*)