regular expressions problem

Antworten
Nachricht
Autor
slack
Beiträge: 6
Registriert: 25. Aug 2006 16:42

regular expressions problem

#1 Beitrag von slack » 25. Aug 2006 16:43

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

Marco Gerber

#2 Beitrag von Marco Gerber » 25. Aug 2006 17:18

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: Alles auswählen

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

Marco

slack
Beiträge: 6
Registriert: 25. Aug 2006 16:42

hmm...

#3 Beitrag von slack » 25. Aug 2006 17:25

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 :/

slack
Beiträge: 6
Registriert: 25. Aug 2006 16:42

#4 Beitrag von slack » 25. Aug 2006 17:59

aja, das ganze soll in c realisiert werden... mit pcre ;)

gruß

Marco Gerber

#5 Beitrag von Marco Gerber » 25. Aug 2006 18:15

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: Alles auswählen

-[0-9]


Ich hoffe du verstehst wo das Problem tatsaechlich liegt.

hth

Marco

slack
Beiträge: 6
Registriert: 25. Aug 2006 16:42

#6 Beitrag von slack » 25. Aug 2006 19:01

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ß

Benutzeravatar
Janka
Beiträge: 3575
Registriert: 11. Feb 2006 19:10

#7 Beitrag von Janka » 25. Aug 2006 20:49

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: Alles auswählen

$ 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
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

slack
Beiträge: 6
Registriert: 25. Aug 2006 16:42

#8 Beitrag von slack » 25. Aug 2006 21:25

DANKE
*umwucht* :)))))
das war es wo ich gesucht habe :wink:

Marco Gerber

#9 Beitrag von Marco Gerber » 25. Aug 2006 21:47

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

texture

#10 Beitrag von texture » 26. Aug 2006 7:37

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

Benutzeravatar
Janka
Beiträge: 3575
Registriert: 11. Feb 2006 19:10

#11 Beitrag von Janka » 26. Aug 2006 9:34

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
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

slack
Beiträge: 6
Registriert: 25. Aug 2006 16:42

#12 Beitrag von slack » 27. Aug 2006 11:27

@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

Antworten