Moin, ich quäle mich im Moment mit regulären Ausrücken rum. Vielleicht kann mir hier jemand helfen. Ich muss einen Ausdruck der folgenden Form auseinander nehmen: "(x,y)(a,b)(c,d)..." x, y, etc sind Fließkommazahlen, sowas wie 1, 2.3, 1e-4, -3.14159 in einem ersten Schritt sollen alle Klammern gefunden werden, also "(x,y)" "(a,b)" ... Daran scheitere ich. Mit "(\(.*\))+" z.B findet er nur den gesamten String und nicht die einzelnen Klammern. Ich wüsste nicht, was ich ändern müsste. Gruß Joachim -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo Joachim Am 16.07.20 um 13:22 schrieb Joachim H.:
Moin,
ich quäle mich im Moment mit regulären Ausrücken rum.
Vielleicht kann mir hier jemand helfen.
Ich muss einen Ausdruck der folgenden Form auseinander nehmen:
"(x,y)(a,b)(c,d)..."
x, y, etc sind Fließkommazahlen, sowas wie 1, 2.3, 1e-4, -3.14159
in einem ersten Schritt sollen alle Klammern gefunden werden, also "(x,y)" "(a,b)" ...
Daran scheitere ich.
Mit "(\(.*\))+" z.B findet er nur den gesamten String und nicht die einzelnen Klammern.
Reguläre Ausdrücke sind grundsätzlich erst einmal gierig und versuchen eine möglichst lange Übereinstimmung zu finden. Du könntest also entweder die schließende Klammer ausschließen oder den Ausdruck als "nicht gierig" zu definieren. Ob alle Implementierungen der Regulären Ausdrücke auch ein "nicht gierig" enthalten, entzieht sich meiner Kenntnis. Daher hier erst einmal der einfache Weg mit dem Ausschluss. Statt des Punktes (jedes Zeichen) definierst Du eine Zeichenmenge, die genau die schließende Klammer verbietet [^)]. Das ganze sieht dann so aus. \([^)]*\) Damit findest Du dann aber auch nur die erste Klammer! Wenn Du dich näher mit dem Thema beschäftigen willst ist ein guter Einstiegspunkt https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck Viel Erfolg Mark -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo! Wie wär's mit dem folgenden Befehl: sed 's/)(/)\n(/g' Beispiel:
echo "(1,2.3)(1e-4,5)(-3.14159,1)(2.3,1e-4)(6e-2,-3.14159)" | sed 's/)(/)\n(/g' (1,2.3) (1e-4,5) (-3.14159,1) (2.3,1e-4) (6e-2,-3.14159)
Gruß, Kimmo to, 2020-07-16 kello 13:22 +0200, Joachim H. kirjoitti:
Moin,
ich quäle mich im Moment mit regulären Ausrücken rum.
Vielleicht kann mir hier jemand helfen.
Ich muss einen Ausdruck der folgenden Form auseinander nehmen:
"(x,y)(a,b)(c,d)..."
x, y, etc sind Fließkommazahlen, sowas wie 1, 2.3, 1e-4, -3.14159
in einem ersten Schritt sollen alle Klammern gefunden werden, also "(x,y)" "(a,b)" ...
Daran scheitere ich.
Mit "(\(.*\))+" z.B findet er nur den gesamten String und nicht die einzelnen Klammern.
Ich wüsste nicht, was ich ändern müsste.
Gruß
Joachim
-- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
Hallo, Am Thu, 16 Jul 2020, Joachim H. schrieb:
Ich muss einen Ausdruck der folgenden Form auseinander nehmen:
"(x,y)(a,b)(c,d)..."
x, y, etc sind Fließkommazahlen, sowas wie 1, 2.3, 1e-4, -3.14159
in einem ersten Schritt sollen alle Klammern gefunden werden, also "(x,y)" "(a,b)" ...
Daran scheitere ich.
Mit "(\(.*\))+" z.B findet er nur den gesamten String und nicht die einzelnen Klammern.
Ich wüsste nicht, was ich ändern müsste.
$ printf '(1,2.3)(1e-4,5)(-3.14159,1)\n (2.3,2.78E-2)(6e-2,-3.14)\n' |\ perl -ne ' chomp; $l = $_; do { if ( $l =~ s/^\s*\(([\d.eE-]+),([\d.eE-]+)\)// ) { printf("[ % f, % f ]\n", $1, $2); } } while($l); ' [ 1.000000, 2.300000 ] [ 0.000100, 5.000000 ] [ -3.141590, 1.000000 ] [ 2.300000, 0.027800 ] [ 0.060000, -3.140000 ] Noch Fragen? -dnh -- [Auszug aus man grep] Und spaetestens jetzt sollte niemand mehr denken, dass regulaere Ausdruecke gleich regulaeren Ausdruecken seien ;-) [Eilert Brinkmann in suse-linux] -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org
participants (4)
-
David Haller
-
Joachim H.
-
Kimmo Elo
-
Mark Wenzel