Seite 1 von 2

[Help]regular expression

Verfasst: 01.03.2010, 10:12
von Cpt.Gambit
Huhu
brauch mal eben die unendliche P0w4r von pq..

ich suche nen Regulären Ausdruck der mir z.b. aus diesem String
010F 08 0000303A 01
alle zeichen aus der dritten Gruppe (0000303A) rausholt. Der Dreh dabei ist die Anzahl Zahlen und Buchstaben (nur A-F) der durch Leerzeichen getrennten Grüppchen muss variabel sein. Kann also auch mal
0001 D56810 0102 BB2847
sein.

Kann einer helfen ?

:ugly:

Verfasst: 01.03.2010, 10:15
von Elvistelefon
Mir hilft immer folgende Seite:

http://regexlib.com/

Verfasst: 01.03.2010, 10:18
von Cpt.Gambit
Jo is auch meine Seite ..
Hab mich aber schon totprobiert an Ausdrücken, kriegs aber nicht hin :mad:

Verfasst: 01.03.2010, 10:25
von drluv
[a-zA-Z0-9]+ [a-zA-Z0-9]+ ([a-zA-Z0-9]+) [a-zA-Z0-9]+

würde bei preg_match in php die dritte gruppe matchen.

Verfasst: 01.03.2010, 10:25
von z3r0c00l
Ich verstehe leider die Angabe nicht ganz - außerdem prüft ein Regex doch nur, ob ein String zu einer bestimmten Sprachklasse gehört oder nicht, oder?

Verfasst: 01.03.2010, 10:41
von whatever
Meinst du nicht, dass reguläre Ausdrücke für diesen einfachen Zweck etwas übertrieben sind?
Entweder du liest einfach alles zwischen dem zweiten und dritten Leerzeichen ein, oder du benutzt eine funktion wie "explode" oder "split", die in vielen Sprachen verfügbar ist, um den String an den Leerzeichen in seine Bestandteile zu zerlegen.

Verfasst: 01.03.2010, 10:42
von Cpt.Gambit
drluv hat geschrieben:[a-zA-Z0-9]+ [a-zA-Z0-9]+ ([a-zA-Z0-9]+) [a-zA-Z0-9]+
Der isses ..

danke

Verfasst: 01.03.2010, 10:44
von Warzenschwan
UP.whatever hat geschrieben:Meinst du nicht, dass reguläre Ausdrücke für diesen einfachen Zweck etwas übertrieben sind?
Entweder du liest einfach alles zwischen dem zweiten und dritten Leerzeichen ein, oder du benutzt eine funktion wie "explode" oder "split", die in vielen Sprachen verfügbar ist, um den String an den Leerzeichen in seine Bestandteile zu zerlegen.
#

Verfasst: 01.03.2010, 10:53
von drluv
UP.whatever hat geschrieben:Meinst du nicht, dass reguläre Ausdrücke für diesen einfachen Zweck etwas übertrieben sind?
Entweder du liest einfach alles zwischen dem zweiten und dritten Leerzeichen ein, oder du benutzt eine funktion wie "explode" oder "split", die in vielen Sprachen verfügbar ist, um den String an den Leerzeichen in seine Bestandteile zu zerlegen.
Sehe ich im Grunde ähnlich, in diesem Fall kommt es sicherlich auch Kanonen auf Spatzen gleich, aber ich habe mir auch irgendwann dazu gezwungen wo es geht RegExps zu nutzen, einfach um zu lernen damit besser umzugehen. Denn gerade diese einfachen Dinge sind doch die Basis für irgendwelchen assoschwanz RegExp Statements.

Verfasst: 01.03.2010, 11:01
von Cpt.Gambit
Da wo ich die regulären Ausdrücke benutze gibts sowas wie split und explode nicht. Die Sprache ist sehr begrenzt und proprietär, wenn man sowas sagen kann.

Verfasst: 01.03.2010, 11:06
von catch
:lol: nerds!

Verfasst: 01.03.2010, 11:07
von Cpt.Gambit
Bild

schwul

Verfasst: 01.03.2010, 11:15
von Mein Name sei Wapaz
CODINGFORUM! :mad:

Verfasst: 01.03.2010, 11:18
von Cpt.Gambit
Oh das gibts ?
Na dann verschieben, closen oder sonstwas machen.

Verfasst: 01.03.2010, 11:18
von digitus
Cpt.Gambit hat geschrieben:Da wo ich die regulären Ausdrücke benutze gibts sowas wie split und explode nicht. Die Sprache ist sehr begrenzt und proprietär, wenn man sowas sagen kann.
Das glaub ich ja fast nicht. Auf Array-Indizes zugreifen können doch eigtl alle Sprachen, mehr brauchst du ja nicht.

Dass du dich daran totprobiert hast wage ich auch mal zu bezweifeln. Der erste Ansatz wäre doch, per RegEx nach einer Folge von Gruppen aus Leerzeichen und nicht-Leerzeichen zu suchen. Das ist dann auch robuster als nur alphanum. Zeichen zu suchen.

Verfasst: 01.03.2010, 12:19
von Whitey Weiszmann
auch wenn die Frage schon beantwortet wurde, hier noch ein nützlicher Link für alle Regex-nerds :)
http://rubular.com/
Benutz das gerne zum "on-the-fly" testen, ohne jedesmal Chars escapen zu müssen.

Verfasst: 01.03.2010, 20:31
von HomicideSapiens
http://www.regular-expressions.info

für eclipse kann ich das plugin quickrex empfehlen.

und die regex von drluv ist viel zu lang und lesbar :ugly:

(?i:[a-f\d]+ ){2}([a-f\d]+) [a-f\d]+

Verfasst: 02.03.2010, 00:25
von zeeno
Cjs_3f hat geschrieben:auch wenn die Frage schon beantwortet wurde, hier noch ein nützlicher Link für alle Regex-nerds :)
http://rubular.com/
Benutz das gerne zum "on-the-fly" testen, ohne jedesmal Chars escapen zu müssen.
http://regexpal.com/ gefällt mir besser. :D

Verfasst: 02.03.2010, 01:26
von Whitey Weiszmann
zeeno hat geschrieben:http://regexpal.com/ gefällt mir besser. :D
gebookmarked, falls rubular mal down sein sollte :wave:

Verfasst: 02.03.2010, 01:46
von oNyx
http://www.cuneytyilmaz.com/prog/jrx/

ich benutz das ding immer in komodo über tools->extension developer->regexp evaluator

die seite da oben lässt sich übrigens einfach auf hdd speichern. is ne einzelne html mit allem drinne.

Verfasst: 02.03.2010, 10:01
von Davion3000
Unter Annahme der oben genannten Datenstruktur, geht es folgend ohne fette regexp Ausdrücke:
#~:awk '{ print $3 }' /foo/bar
-F muss nicht angegeben werden, weil Leerzeichen default Feldtrenner sind.

Verfasst: 02.03.2010, 10:29
von acid
$penis = explode(' ', $string);
return $penis[2];

Ginge auch.

Verfasst: 02.03.2010, 21:44
von EviLsEyE
acid hat geschrieben:$penis = explode(' ', $string);
return $penis[2];

Ginge auch.
Und wenn in Deinem Penisfragment ungültige Zeichen enthalten sind? (d.h. alles außer 0-9 und A-F)

Verfasst: 02.03.2010, 22:06
von HomicideSapiens
bei einem fragmentierten Penis hat er größere Probleme als ungültige Zeichen.

On-Topic: Falls der String validiert werden muss, find ich regex keine schlechte Lösung. Ansonsten würde ich nichtmal zu split greifen (wer weis wie lang der string noch ist ;) ) sondern einfach den substring zwischen 2. und 3. leerzeichen nehmen.

Code: Alles auswählen

int l2=str.indexOf(' ',str.indexOf(' '));
int l3=str.indexOf(' ',l2);
string substr=str.subString(l2,l3);

Verfasst: 03.03.2010, 07:10
von spid
HomicideSapiens hat geschrieben:bei einem fragmentierten Penis hat er größere Probleme als ungültige Zeichen.

On-Topic: Falls der String validiert werden muss, find ich regex keine schlechte Lösung. Ansonsten würde ich nichtmal zu split greifen (wer weis wie lang der string noch ist ;) ) sondern einfach den substring zwischen 2. und 3. leerzeichen nehmen.

Code: Alles auswählen

int l2=str.indexOf(' ',str.indexOf(' '));
int l3=str.indexOf(' ',l2);
string substr=str.subString(l2,l3);
einfach den string rückwärts suchen (in der annahme, daß es immer nur 4 blöcke gibt):

(java)
int l3 = str.lastIndexOf(' ');
int l2 = str.lastIndexOf(' ', l3-1);
[...]

Verfasst: 08.03.2010, 23:24
von saftig
cut -d " " -f 3

Verfasst: 08.06.2010, 13:00
von Cpt.Gambit
Ich bins wieder :)

Vorweg, in der Programmiersprache hier ist man sehr eingeschränkt, wer interesse hat:
http://publib.boulder.ibm.com/infocente ... HEFHB.html

Wie sagt man in nem regulären Ausruck, dass er nur die ersten Zeichen auf die er trifft mitnehmen soll?

Bsp:
(Test) Threshold reached for Slow Responses
Ich will das in den Klammern haben, recht einfach:
\((.*)\).*

Wenn nun aber weiterhinten im Text nochmal ne Klammer hab, parst er irgend nen Mist raus, speziell alles zwischen der Ersten Klammer auf und der Letzten Klammer zu.

(Test) Threshold reached for Slow Responses (Bla Blubb)

Wie sag ich dem, daß er nur die ersten Inhalt der Klammer betrachten soll?

Verfasst: 08.06.2010, 16:17
von zeeno
Der Fehler liegt bei deinem .* in der Klammer. Das ist zu gierig und schluckt drekt alles bis zur letzten geschlossenen Klammer.

Probier folgenden Regex aus

Code: Alles auswählen

\((\w+)\)
In PHP funktioniert es soweit.

Code: Alles auswählen

preg_match('/\((\w+)\)/','(Foo) du doofe Nuss (Bar) du doof',$match);
var_dump($match);
Liefert folgendes:

Code: Alles auswählen

array(2) { 
    [0]=>  string(5) "(Foo)" 
    [1]=>  string(3) "Foo" 
} 
Nicht von dem ersten Platz irritieren lassen. Da steht immer nochmal die ganze Zeichenkette drin die gefunden wurde (ohne Patterns). In diesem Fall (Foo).

Verfasst: 08.06.2010, 17:21
von digitus
Außer den * und + Operator von greedy auf stingy zu schalten (ging glaub auch mit ? dahinter), kann man auch einfach nach dem Komplement der schließenden Klammer suchen, bis zur nächsten schließenden Klammer.

Verfasst: 08.06.2010, 23:17
von Urstoff
Davion3000 hat geschrieben:Unter Annahme der oben genannten Datenstruktur, geht es folgend ohne fette regexp Ausdrücke:
#~:awk '{ print $3 }' /foo/bar
-F muss nicht angegeben werden, weil Leerzeichen default Feldtrenner sind.
Dafür reicht selbst cut, da braucht man nicht dieses fette, träge awk anwerfen. :rolleyes:
Cpt.Gambit hat geschrieben:Bsp:
(Test) Threshold reached for Slow Responses
Ich will das in den Klammern haben, recht einfach:
\((.*)\).*

Wenn nun aber weiterhinten im Text nochmal ne Klammer hab, parst er irgend nen Mist raus, speziell alles zwischen der Ersten Klammer auf und der Letzten Klammer zu.

(Test) Threshold reached for Slow Responses (Bla Blubb)

Wie sag ich dem, daß er nur die ersten Inhalt der Klammer betrachten soll?
\((.*?)\).*