RegExp-Ausdruck gesucht

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
maze
Beiträge: 9
Registriert: 30.09.2010, 23:31

RegExp-Ausdruck gesucht

Beitrag von maze »

Hi, ich versuch grad mir einen Ausdruck zu basteln, der folgendes macht:

Finde alle Zeilen (vollstaendige) ausser jene, die dem Muster xyz entsprechen.

Hat jemand eine Ahnung, wie das geht?

(vielleicht hilft's - ich arbeite grad unter ubuntu 10.04 mit geany und es sollen nur die zeilen nicht gefunden werden, die mit http anfangen und mit .html aufhoeren - bisher sieht das bei mir so aus: [^(^http.*html)] aber das findet alle anderen zeichen (also nicht zeilenweise, wie ich es moechte) und noch dazu auch teile aus den url's, sprich findet in der zeile http://web.de/index.html auch als erstes gleich den Doppelpunkt).

hilfe waere toll, aber bitte keine workarounds (es sei denn, so etwas geht mit regExp nicht, was ich mir ehrlichgesagt nich vorstellen kann ;) )
Zuletzt geändert von maze am 01.10.2010, 13:10, insgesamt 1-mal geändert.
gruss maze
INe5xIlium(Freak5)
Beiträge: 32
Registriert: 29.07.2002, 11:43

Re: RegExp-Ausdruck gesucht

Beitrag von INe5xIlium(Freak5) »

Für reguläre Sprachen gilt R3=R_1\R_2
Wenn ich es richtig verstanden habe kannst du Zeilen, die du nicht haben willst und Zeilen, die du haben willst, jeweils beschreiben, oder? Dann ist das beschreiben durch eine reguläre Sprache definitiv möglich. Wenn du etwas Arbeit investieren möchtest, dann müsste es doch mit dem Ardens Lemma gehen. Ich denke den Automaten dazu kann man sich schon irgendwie hinbasteln, das was du nicht willst, leitest du in einen Fehlerzustand und was da nicht reinfällt kommt zum Ziel :D .
Ich wette, da gibt es aber irgendwelche Erweiterungen, die ein explizites NICHT zulassen, mit Lookahead. Dann ist es zwar kein RegEx mehr, aber du hast dir viel Zeit gespart ^^.
Deine RegEx entspricht nicht ganz der Beschreibung, die du gegeben hast, oder? Da steht ein "rar" drin, über das du vorher kein Wort verloren hast. Den Syntax kenne ich leider auch nicht.
pUnkOuter
Establishment
Beiträge: 303
Registriert: 15.04.2002, 15:59

Re: RegExp-Ausdruck gesucht

Beitrag von pUnkOuter »

Also wie geany das macht, weiss ich nicht, aber im Terminal kannste einfach "grep -v "^http.*html" machen.
Ein Zeiger ins Blaue ist wie ein Wegweiser nach <SEGFAULT>. Wenn du denkst, mein Name hat was mit abgefuckter Kleidung und bunten Haaren zu tun, dann kehr besser um.
zwergmulch
Beiträge: 91
Registriert: 07.12.2009, 16:42
Echter Name: Fabian R

Re: RegExp-Ausdruck gesucht

Beitrag von zwergmulch »

Einzelne Zeilen findet man mit ^ als Zeilenbeginn und $ als Zeilenende (damit wäre das Problem mit dem nicht zeilenweise gelöst).
Statt dem [^(^)] würde ich ein (xyz){0} verwenden.
Mit html aufhören wäre dann "html$".
Ein Punkt ist "\.".
Zusammen also "^(http){0}.*\.html$" (meiner Meinung nach).

Edit: : Auf neuen Post vom Threadopener geachtet.

Grüße zwergmulch
Zuletzt geändert von zwergmulch am 01.10.2010, 13:37, insgesamt 1-mal geändert.
Bild
maze
Beiträge: 9
Registriert: 30.09.2010, 23:31

Re: RegExp-Ausdruck gesucht

Beitrag von maze »

INe5xIlium(Freak5) hat geschrieben:Für reguläre Sprachen gilt R3=R_1\R_2
Wenn ich es richtig verstanden habe kannst du Zeilen, die du nicht haben willst und Zeilen, die du haben willst, jeweils beschreiben, oder? Dann ist das beschreiben durch eine reguläre Sprache definitiv möglich. Wenn du etwas Arbeit investieren möchtest, dann müsste es doch mit dem Ardens Lemma gehen. Ich denke den Automaten dazu kann man sich schon irgendwie hinbasteln, das was du nicht willst, leitest du in einen Fehlerzustand und was da nicht reinfällt kommt zum Ziel :D .
Ich wette, da gibt es aber irgendwelche Erweiterungen, die ein explizites NICHT zulassen, mit Lookahead. Dann ist es zwar kein RegEx mehr, aber du hast dir viel Zeit gespart ^^.
Deine RegEx entspricht nicht ganz der Beschreibung, die du gegeben hast, oder? Da steht ein "rar" drin, über das du vorher kein Wort verloren hast. Den Syntax kenne ich leider auch nicht.
okeeeeey - ich tu mal so, als haette ich noch nie was von theoretischer informatik und automatentheorien gehoert - dann koennte ich jetzt aber mal wenig damit anfangen, zumal ich da schon probleme mit pumping-lemma hatte^^

der knackpunkt ist, ich kann die zeilen, die ich nicht haben will nur dadurch beschreiben, das ich ich die beschreibe, die haben will, und dann sage diese nicht. also nich das wahre vom ei..
(btw - das mit dem rar war ein versehen, das war eine der zeilen, die eben nicht auf html endete wo ich das rauskopiert hab... also alles andere (php, htm, rar, 'zahlen' usw boese html gut :D ))

mir hat sich auch grade das problem aufgezwaengt, das ich gern .html haette, aber '.' steht ja fuer jedes beliebige zeichen... :?

Die Syntax im uebrigen, ist auch recht geany-speziefisch moeschte ich mal behaupten..

@pUnkOuter
terminal bringt mir leider nich sooo viel, da ich die unerwuenschten zeilen rausparsen moechte.
gruss maze
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Re: RegExp-Ausdruck gesucht

Beitrag von Matthias Gubisch »

Um das Problem mit dem Punkt in den Griff zu bekommen:
Eigentlich gibt es bei regulären Ausdrücken auch immer ein Escape zeichen welches das folgende Zeichnen nicht als Steuerzeichen sonder teil des Such-Strings interpretieren lässt;)

Gruß
Matthias
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
zwergmulch
Beiträge: 91
Registriert: 07.12.2009, 16:42
Echter Name: Fabian R

Re: RegExp-Ausdruck gesucht

Beitrag von zwergmulch »

@Matthias Gubisch: Hab' ich eigentlich schon mit einem Edit im Post davor gesagt, aber das ist halt anscheinend nicht so deutlich (obwohl ich es extra noch mal mit rot und groß gekennzeichnet habe ;-) ), also noch mal:

Lösung ist imho "^(http){0}.*\.html$".
Bild
maze
Beiträge: 9
Registriert: 30.09.2010, 23:31

Re: RegExp-Ausdruck gesucht

Beitrag von maze »

zwergmulch hat geschrieben:Einzelne Zeilen findet man mit ^ als Zeilenbeginn und $ als Zeilenende (damit wäre das Problem mit dem nicht zeilenweise gelöst).
Statt dem [^(^)] würde ich ein (xyz){0} verwenden.
Mit html aufhören wäre dann "html$".
Ein Punkt ist "\.".
Zusammen also "^(http){0}.*\.html$" (meiner Meinung nach).

Edit: : Auf neuen Post vom Threadopener geachtet.

Grüße zwergmulch
:oops: sry, das hatte ich garnich gesehen, da hab ich wohl grad meine antwort geschrieben :) \. - das haette ich aber auch selbst hinbekommen koennen - sry, dieses mal hab ich aber etwas laenger nachgedacht ;)

also ^(http){0}.*\.html$ funzt nicht, wobei ich mir vorstellen kann, das er mit der menge {0} nicht klar kommt..
ich was aehnliches gebaut inzwischen:
^([^http]*)$ - fehlt natuerlich noch der teil mit .html drin..
leider wird mir so keine zeile selektiert, die h oder t oder p enthaelt.
habs also auch so probiert:
^([^(http)]*)$ und so ^([^[http]]*)$ - aber dann bekomm ich garkeinen treffer mehr - achso, ich arbeite uebrigens auf einer testmenge, um zu sehen, ob ich uaf dem richtigen weg bin:

Code: Alles auswählen

htmltorro
schrammel dammel
dd http html
weis nicht html
dhttp
htmlhttp
html.httem
http.html
hausboot
httpahtml
dorffest
aaaaaaaaaaaaaaaaaaaaa
wenn ich herausgefunden habe, wie ich die verneinung auf den folgenden ausdruck und nciht nur auf das naechste zeichen beziehen kann, wuerde ich einfach noch das *\.html mit dranhaengen.. so hab ich mir das jedenfalls gedacht, aber offenbar hab ich mir schon den teil mit der verneinung zu einfach vorgestellt :/
gruss maze
Alexander Kornrumpf
Moderator
Beiträge: 2110
Registriert: 25.02.2009, 13:37

Re: RegExp-Ausdruck gesucht

Beitrag von Alexander Kornrumpf »

Kurze Antwort: Idealerweise benutzt du das Positiv Pattern, und hast die "Matche alles was nicht diesem pattern entspricht" Eigenschaft außerhalb des Patterns (z.B. !~ in Perl). Deswegen ist der Tipp grep -v zu verwenden wenn dein Tool das nicht kann schon der richtige.

Lange Antwort (in ThInf-sprech):

Wenn du dir den ganzen Syntax-Zucker von POSIX/Perl mal wegdenkst, stehst du sonst vor der Aufgabe den Ausdruck zu konstruieren der alles matcht was nicht das Pattern ist und zwar nur unter Verwendung von Vereinigung, Konkatenation und Kleene* . Denn (@INe5xIlium(Freak5)) nur weil reguläre Sprachen unter Komplement abgeschlossen sind, heißt dies nicht dass reguläre Ausdrücke auch Operatoren dafür haben.
Diese Aufgabe kann man trivial automatisieren, den Automaten nehmen und akzeptierende und nicht akzeptierende Zustände vertauschen, Ausdruck zum Automaten erzeugen. Es würde mich wundern dass es dafür kein Tool gäbe, seltsamerweise ist die erste Seite bei Google aber voll von "use negative lookahead" Bullshit.

Mich juckt es schon in den Fingern das eben schnell zu implementieren. OMG I got nerd sniped.
maze
Beiträge: 9
Registriert: 30.09.2010, 23:31

Re: RegExp-Ausdruck gesucht

Beitrag von maze »

Alexander Kornrumpf hat geschrieben:...Idealerweise benutzt du das Positiv Pattern, und hast die "Matche alles was nicht diesem pattern entspricht" Eigenschaft außerhalb des Patterns (z.B. !~ in Perl)...
naja, das sagst du so einfach.. im Fall geany waere das
[^(^(http).*\.html$)] - aber: genau diesen Ausdruck nicht heist ja hier nicht, das die Negation eine ganze Zeile seien muss.. oder hab ich falsch negiert?

edit:
..nur der Vollstaendigkeit halber: ^(http).*\.html$ findet genau die Zeilen, die ich von dem Muster ausgrenzen will, soweit war ich nun schon, bei dem Ausdruck oben habe ich lediglich [^()] ergaenzt.
gruss maze
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Re: RegExp-Ausdruck gesucht

Beitrag von Matthias Gubisch »

zwergmulch hat geschrieben:@Matthias Gubisch: Hab' ich eigentlich schon mit einem Edit im Post davor gesagt, aber das ist halt anscheinend nicht so deutlich (obwohl ich es extra noch mal mit rot und groß gekennzeichnet habe ;-) ), also noch mal:

Lösung ist imho "^(http){0}.*\.html$".
Sorry hab ich wohl überlesen ;)
ich sollte wohl nicht so viele Sachen nebenbei machen ;)
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Alexander Kornrumpf
Moderator
Beiträge: 2110
Registriert: 25.02.2009, 13:37

Re: RegExp-Ausdruck gesucht

Beitrag von Alexander Kornrumpf »

maze hat geschrieben:
Alexander Kornrumpf hat geschrieben:...Idealerweise benutzt du das Positiv Pattern, und hast die "Matche alles was nicht diesem pattern entspricht" Eigenschaft außerhalb des Patterns (z.B. !~ in Perl)...
naja, das sagst du so einfach.. im Fall geany waere das
[^(^(http).*\.html$)] - aber: genau diesen Ausdruck nicht heist ja hier nicht, das die Negation eine ganze Zeile seien muss.. oder hab ich falsch negiert?

edit:
..nur der Vollstaendigkeit halber: ^(http).*\.html$ findet genau die Zeilen, die ich von dem Muster ausgrenzen will, soweit war ich nun schon, bei dem Ausdruck oben habe ich lediglich [^()] ergaenzt.

[^(^(http).*\.html$)] ist eben nicht die Negation von ^(http).*\.html$, das habe ich auch nirgends behauptet.

http://augeas.net/libfa/operations.html

würde es erlauben das was ich oben gesagt hab als 3 zeiler zu implementieren, leider kompiliert es nur mit dem gcc den ich gerade nicht zur Hand habe. Vielleicht erbarmt sich ja jemand.
maze
Beiträge: 9
Registriert: 30.09.2010, 23:31

Re: RegExp-Ausdruck gesucht

Beitrag von maze »

hm.. nicht was ich suche - ich will ja kein anderes Programm da mit rein ziehen. sonst koennte ich natuerlich auch grep verwenden..


edit:
..ok, ich find mich mal damit ab, dass das mit den begrenzten geany-regexp nicht moeglich ist, das korrekt zu negieren.



Danke allen, die sich so rege beteiligt haben,bis die Tage :)[/size][/b]
gruss maze
Alexander Kornrumpf
Moderator
Beiträge: 2110
Registriert: 25.02.2009, 13:37

Re: RegExp-Ausdruck gesucht

Beitrag von Alexander Kornrumpf »

Natürlich geht es, es ist nur unglaublich nervig. Ich habe auch nicht vorgeschlagen ein anderes Programm mit reinzuziehen, sondern ein Tool vorgeschlagen dass einen Ausdruck erzeugt, den du dann in deinem Programm verwenden kannst. Ich habe das spaßeshalber mal mit Pen&Paper für dich gemacht.

Code: Alles auswählen

^([^h]|h[^t]|ht[^t]|htt[^p]).*|http([^\.]|[\.]+([^\.h]|h([\.]+[^\.h]|[^\.t]|ht([\.]+[^\.h]|[^\.m])|htm([\.]+[^\.h]|[^\.l])))*$
maze
Beiträge: 9
Registriert: 30.09.2010, 23:31

Re: RegExp-Ausdruck gesucht

Beitrag von maze »

WoW, das' mal'n Hammer Ausdruck^^ - haste dir dazu einen Automaten aufgezeichnet, und an dem rumprobiert? Da haette ich mich wohl erst mal wieder etwas mehr ins Thema reinfinden muessen - ich hoffe du hast dabei wenigstens echt Spass gehabt :D
ich glaub, das es auch damit nicht geht, das liegt daran, das geany die regexp anders auswertet (als zB grep) - mit der {0}-Notation die weiter oben gepostet wurde, hat es ja auch schon nicht funktioniert.
Aber danke, das du dir so ne Muehe gemacht hast - wenn du das in vielen Threads machst, haste bestimmt bald keine Zeit mehr fuer was anderes ;)
so, ich muss aber nun auch erstmal pennen

gn8
gruss maze
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4256
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: RegExp-Ausdruck gesucht

Beitrag von Chromanoid »

maze hat geschrieben:WoW, das' mal'n Hammer Ausdruck^^ - haste dir dazu einen Automaten aufgezeichnet, und an dem rumprobiert? Da haette ich mich wohl erst mal wieder etwas mehr ins Thema reinfinden muessen - ich hoffe du hast dabei wenigstens echt Spass gehabt
Alexander Kornrumpf hat geschrieben:ein Tool vorgeschlagen dass einen Ausdruck erzeugt
...
@Alexander hab dich doch richtig verstanden oder? :)
Alexander Kornrumpf
Moderator
Beiträge: 2110
Registriert: 25.02.2009, 13:37

Re: RegExp-Ausdruck gesucht

Beitrag von Alexander Kornrumpf »

Sagen wir ich hab es semiautomatisch gemacht. Ein paar Sachen, welche die verwendete Lib nicht konnte habe ich von Hand gemacht. Rumprobieren muss man da gar nichts, da klar ist wie es geht. Und ja ich hab Spaß an sowas, aber wenn ich öfter vor dem Problem stünde würde ich doch lieber den Algo implementieren.
maze
Beiträge: 9
Registriert: 30.09.2010, 23:31

Re: RegExp-Ausdruck gesucht

Beitrag von maze »

Halli Hallo - ich knuepfe mal hier an meinen alten Beitrag an, da er genau das Thema behandelt, das ich nun wieder vor mir habe:

Mein altes, leidiges Thema: Regulaere Ausdruecke. Ich weis nicht, ich lese Buecher dazu, und Websites und Frage Leute.. und trotzdem komme ich immer an einen Punkt, der mich 'auflaufen' laesst...

Zu meiner Frage:
Kann ich unabhaengige Ausdurecke kombinieren?

Also Folgendes: Ich moechte alle ä's durch ae's ersetzen lassen, alle ö's durch oe's, ü's durch ue's und das gleiche nochmal fuer ÄÖÜ (also Ae, Oe, Ue).

Einzeln ja ueberhaupt kein Problem, aber leider unabhaengig (bis zu einem gewissen Grad) - Kann ich sowas generell in einem Ausdruck kombinieren?

Danke schonmal fuer eure Hilfe!
gruss maze
Alexander Kornrumpf
Moderator
Beiträge: 2110
Registriert: 25.02.2009, 13:37

Re: RegExp-Ausdruck gesucht

Beitrag von Alexander Kornrumpf »

Das Problem scheint mir zu sein, dass du nicht richtig verstanden hast was reguläre Ausdrücke sind.

Reguläre Ausdrücke haben mit Textersetzung absolut nichts zu tun. Sie dienen der Beschreibung einer Sprache. Offensichtlich ist die Sprache L={ä,ü,ö} eine andere als die Sprachen L1={ä} L2={ü}, L3={ö}. Alle drei Sprachen sind aber regulär, denn reguläre Sprachen sind abgeschlossen unter Vereinigung. Das gleiche gilt analog wenn du die Großbuchstaben dazu nimmst.

Du kannst also L natürlich durch einen kombinierten Ausdruck erkennen lassen, ich vermute das war dir ohnehin klar. Ob das von dir verwendete Tool dir aber dann noch erlaubt die gewünschte Textersetzung durchführen zu lassen hängt stark vom Tool ab und ist keine Frage die reguläre Ausdrücke betrifft.
maze
Beiträge: 9
Registriert: 30.09.2010, 23:31

Re: RegExp-Ausdruck gesucht

Beitrag von maze »

Ah ok, danke - ja... Ich hab mich in theoretischer Informatik schon immer schwer mit den Sprachen getan. Das ich die ausdruecke suchen kann, war mir klar, stimmt.
Hmm.. ok, danke.
Zuletzt geändert von maze am 30.09.2011, 20:57, insgesamt 1-mal geändert.
gruss maze
Benutzeravatar
Spyke
Beiträge: 18
Registriert: 11.06.2003, 15:46
Wohnort: Bayern
Kontaktdaten:

Re: RegExp-Ausdruck gesucht

Beitrag von Spyke »

Hättest du ein Beispieltext?
Müsste eh mein RegEx mal auffrischen und das wäre bei Zeiten ev. ne gute Übung.
maze
Beiträge: 9
Registriert: 30.09.2010, 23:31

Re: RegExp-Ausdruck gesucht

Beitrag von maze »

Klar, bau ich dir in einer Minute:

'Knöpfe sind ÜBELST tolle Sächelchen.'
Sollte werden zu:
'Knoepfe sind UEBELST tolle Saechelchen'

Allerdings glaub ich inzwischen nicht mehr, das dies mit einem Ausdruck zu erledigen ist.
Wenn du doch eine Loesung findest, waere ich natuerlich mehr als sehr daran interessiert :D

gruss maze
gruss maze
Benutzeravatar
Spyke
Beiträge: 18
Registriert: 11.06.2003, 15:46
Wohnort: Bayern
Kontaktdaten:

Re: RegExp-Ausdruck gesucht

Beitrag von Spyke »

Unter .Net kann man mit Regex auch Texinhalte ersetzen, dafür wird ein bestimmtes delegate bereitgestellt.
Deshalb vorallem meine Frage, aber das ist ja dann doch eher ein recht simples 'ersetzen', was du brauchst.
Und unter .Net gibts z.B. bei der String Klasse eine einfache Replace Methode (wenn ich mich recht erinnere bei den anderen Sprachen auch, ev. mit entspr. Bibliothek), die wohl auch Performancemäßig günstiger wäre.
Antworten