Page 1 of 1

regular expressions problem

Posted: 25. Aug 2006 16:43
by slack
hallo,

folgendes problem:

habe mehrere pakages:
x11-devel-i486-6.9.0
x11-i486-6.9.0
bzip2-i386-1.2

nun moechte ich aus dem oberen beispiel nur:
x11-deve-i486l haben, aus dem naechsten nur x11-i486 und aus dem letzten bzip2-i386...
hatte es hiermit versucht: .*(!?-\d+)
leider klappt das nicht, kann mir da jemand weiterhelfen?
es gibt nichts was ich mehr hasse als regexp :(

gruß,
slack

Posted: 25. Aug 2006 17:18
by Marco Gerber
Guten Tag

Mit regulaeren Ausruecken kannst du da auch nichts machen, weil regulaere Ausdruecke als endliche Automaten nicht in der Lage sind zu zaehlen.

Was du brauchst ist eine Substitution.

Beispiel fuer die bash:

Code: Select all

$ var="x11-devel-i486-6.9.0"
$ echo ${var%-*}
hth

Marco

hmm...

Posted: 25. Aug 2006 17:25
by slack
es geht mir ja nicht ums zaehlen... ich brauche einen ausdruck der genau das macht:

jedes zeichen solange kein -(zahl...) kommt markieren

ja ich koennte es zur not auch mit dem echo... machen, indem ich in popen ne pipe zum lesen aufmach und das in der sh ausfuehr, ist aber nicht gerade toll :/

Posted: 25. Aug 2006 17:59
by slack
aja, das ganze soll in c realisiert werden... mit pcre ;)

gruß

Posted: 25. Aug 2006 18:15
by Marco Gerber
hello again

Ein endlicher Automat, und damit ein regulaerer Ausdruck loest das sogenannte Wortproblem. Er entscheidet, ob ein Wort zu der Sprache, welche durch den Regulaeren Ausdruck definiert ist, gehoert oder nicht.

Regulaeren Ausdruecken fehlt ein Stack mit dem sie zaehlen koennten (zur Loesung dieses Problems kann man sogenannte Kellerautomaten beiziehen)

Du musst also die Idee, dein gesamtes Problem mittels eines regulaeren Ausdruckes loesen zu wollen verwerfen.

Was du jedoch tun kannst, ist folgendes:
Du grenzt deinen String ein, partitionierst ihn also auf die Anzahl zu untersuchender Zeichen (das sind in deinem Fall genau 2) und fuehrst dann auf diesem Teilstring einen regex durch und wertest dann das Ergebnis aus.
Dieser kann recht einfach aussehen (nicht implementierungsspezifisch !):

Code: Select all

-[0-9]


Ich hoffe du verstehst wo das Problem tatsaechlich liegt.

hth

Marco

Posted: 25. Aug 2006 19:01
by slack
ehrlich gesagt versteh ich das nicht...
hatte immer dieses "kodos" - und damit hab ich immer "gearbeitet".
es ist nur ein string (hab ne funktion die immer wieder aufgerufen wird), also versteh ich auch nich ganz wie du das mit dem zaehlen meinst...
werd mir das ganze morgen nochmal in ruhe angucken

thx fuer die hilfe

gruß

Posted: 25. Aug 2006 20:49
by Janka
Wenn ich dich richtig verstanden habe, willst du alles nach dem letzten "-" abschneiden. Dieses Problem kann man nur mit "non-greedy"-Quantifiers lösen. Das wäre z.B. mit AREs "(.*)-.*?"

Ein Beispiel mit Tcl:

Code: Select all

$ tclsh
% regsub {(.*)-.*?} x11-devel-i486-6.9.0 {\1}
x11-devel-i486
% regsub {(.*)-.*?} x11-i486-6.9.0 {\1}
x11-i486
% regsub {(.*)-.*?} bzip2-i386-1.2 {\1}
bzip2-i386
Janka

Posted: 25. Aug 2006 21:25
by slack
DANKE
*umwucht* :)))))
das war es wo ich gesucht habe :wink:

Posted: 25. Aug 2006 21:47
by Marco Gerber
Also irgendwie versteh ich das jetzt nicht. Du wolltest doch eine Loesung in C ?

Immer oefter habe ich das Gefuehl, dass die Leute selbst gar nicht wissen was sie eigentlich wollen....
Und das bezieht sich jetzt nicht nur auf diesen Thread hier.

Marco

Posted: 26. Aug 2006 7:37
by texture
Immer oefter habe ich das Gefuehl, dass die Leute selbst gar nicht wissen was sie eigentlich wollen....
Und das bezieht sich jetzt nicht nur auf diesen Thread hier.
Die Fragestellungen sind deshalb auch ungenau. Die Antworten werden nicht richtig gelesen und deshalb fragt man einfach noch einmal. Da bemerkt man auch die geringe Eigeninitiative.
Einmal antworten und wenn man merkt das nichts dabei rauskommt, Finger davon.

Google spuckt das übrigens in <1 sec. raus

Posted: 26. Aug 2006 9:34
by Janka
Die korrekte Formulierung eines Problems ist aber schon Teil der Lösung. Wenn man erst einmal weiß, wonach man sucht, ist der Rest vielfach Fleißarbeit.

Mich nerven viel mehr Fragesteller, die eine beschriebene funktionierende Lösung nicht ausprobieren können, weil dies irgendwelche Randprobleme erzeugt, von denen sie im Ursprungsposting aber nichts erwähnt haben. Oder die Randprobleme sind eingebildeter Natur, das ist dann noch schlimmer.

Janka

Posted: 27. Aug 2006 11:27
by slack
@marco und texture
kein plan was fuer probleme ihr habt, mir auch egal, ich habe nach einer stinknormalen regex gefragt - habe btw. lange gegoogled und rumprobiert, also spart euch bitte so "vermutungen" wie geringe eigeninitiative - sowas finde ich beleidigend.

"Einmal antworten und wenn man merkt das nichts dabei rauskommt, Finger davon."
sehe hier keine antwort von dir, also am besten gleich finger von lassen,

mag sicher sein das die fragestellung etwas ungenau war, finde aber mit den antworten von mir durchaus verstaendlich. immerhin wusste janka was ich mein.
werd da auch nix mehr zu schreiben, keine lust auf ne diskussion