Negation in Regulären Ausdrücken
![](https://seccdn.libravatar.org/avatar/e832594709d2f3e981e8ad5c26c52588.jpg?s=120&d=mm&r=g)
Hallo, nachdem ich mich jetzt eine Weile mit O'Reilly, Google und diversen manpages beschäftigt habe und trotzdem zu keiner Lösung gekommen bin, muss ich jetzt mal hier nerven. Gegeben sei folgendes: -------- foobar blabla... ofobar blabla... oofbar blabla... oobfar blabla... oobafr blabla... oobarf blabla... foboar blabla... ... -------- Wie müsste ein regulärer Ausdruck aussehen, dass er alles matcht, aber nicht die Zeilen, in denen 'foobar' am Anfang steht. /^[^foobar].*/ filtert alles raus, klar, wird ja auch nicht als Wort angesehen, sondern als Buchstabenaufzählung. /^[^f][^o][^o][^b][^a][^r] geht auch nicht, weil ja zeichenweise geprüft wird Martin -- when in danger or in doubt, run in circles, scream and shout! pgp-key: via wwwkeys.de.pgp.net, key id is 0x21eec9b0
![](https://seccdn.libravatar.org/avatar/3315311bb8e9e2e94780da1ac1b7f51d.jpg?s=120&d=mm&r=g)
Hallo Martin, * Martin schrieb am 04.09.2003:
Hallo,
nachdem ich mich jetzt eine Weile mit O'Reilly, Google und diversen manpages beschäftigt habe und trotzdem zu keiner Lösung gekommen bin, muss ich jetzt mal hier nerven.
Gegeben sei folgendes:
-------- foobar blabla... ofobar blabla... oofbar blabla... oobfar blabla... oobafr blabla... oobarf blabla... foboar blabla... ... --------
Wie müsste ein regulärer Ausdruck aussehen, dass er alles matcht, aber nicht die Zeilen, in denen 'foobar' am Anfang steht.
egrep -v "^foobar" Grüße, Tom
![](https://seccdn.libravatar.org/avatar/e832594709d2f3e981e8ad5c26c52588.jpg?s=120&d=mm&r=g)
Am Thursday 04 September 2003 02:23 schrieb Thomas Preissler:
Gegeben sei folgendes: -------- foobar blabla... ofobar blabla... oofbar blabla... oobfar blabla... oobafr blabla... oobarf blabla... foboar blabla... ... -------- Wie müsste ein regulärer Ausdruck aussehen, dass er alles matcht, aber nicht die Zeilen, in denen 'foobar' am Anfang steht. egrep -v "^foobar"
Schon klar. Ich suche aber nach einer RegEx, nicht nach einem Kommandozeilentool. Martin -- when in danger or in doubt, run in circles, scream and shout! pgp-key: via wwwkeys.de.pgp.net, key id is 0x21eec9b0
![](https://seccdn.libravatar.org/avatar/7660d68946316127acc3c783073f5084.jpg?s=120&d=mm&r=g)
On Thu, 4 Sep 2003 02:35:48 +0200, "Martin Borchert"
Am Thursday 04 September 2003 02:23 schrieb Thomas Preissler:
Gegeben sei folgendes: -------- foobar blabla... ofobar blabla... oofbar blabla... oobfar blabla... oobafr blabla... oobarf blabla... foboar blabla... ... -------- Wie müsste ein regulärer Ausdruck aussehen, dass er alles matcht, aber nicht die Zeilen, in denen 'foobar' am Anfang steht. egrep -v "^foobar"
Schon klar. Ich suche aber nach einer RegEx, nicht nach einem Kommandozeilentool.
Wo willst Du die RegEx denn einsetzen? Falls vim, versuchs 'mal mit /^\(foobar\)\@! HTH Michael
![](https://seccdn.libravatar.org/avatar/e832594709d2f3e981e8ad5c26c52588.jpg?s=120&d=mm&r=g)
Am Thursday 04 September 2003 03:05 schrieb Michael Siefritz:
On Thu, 4 Sep 2003 02:35:48 +0200, "Martin Borchert"
Am Thursday 04 September 2003 02:23 schrieb Thomas Preissler:
Gegeben sei folgendes: -------- foobar blabla... ofobar blabla... oofbar blabla... oobfar blabla... oobafr blabla... oobarf blabla... foboar blabla... ... -------- Wie müsste ein regulärer Ausdruck aussehen, dass er alles matcht, aber nicht die Zeilen, in denen 'foobar' am Anfang steht. egrep -v "^foobar" Schon klar. Ich suche aber nach einer RegEx, nicht nach einem Kommandozeilentool. Wo willst Du die RegEx denn einsetzen? Falls vim, versuchs 'mal mit /^\(foobar\)\@!
php Martin -- when in danger or in doubt, run in circles, scream and shout! pgp-key: via wwwkeys.de.pgp.net, key id is 0x21eec9b0
![](https://seccdn.libravatar.org/avatar/c65f0a9d70486d425ffd4799ddb379fc.jpg?s=120&d=mm&r=g)
* Martin Borchert schrieb am 04.Sep.2003:
Am Thursday 04 September 2003 02:23 schrieb Thomas Preissler:
Gegeben sei folgendes: -------- foobar blabla... ofobar blabla... oofbar blabla... oobfar blabla... oobafr blabla... oobarf blabla... foboar blabla... ... -------- Wie müsste ein regulärer Ausdruck aussehen, dass er alles matcht, aber nicht die Zeilen, in denen 'foobar' am Anfang steht. egrep -v "^foobar"
Schon klar. Ich suche aber nach einer RegEx, nicht nach einem Kommandozeilentool.
Das kann nicht funktionieren. Was soll er denn alles finden? Er findet doch in der ersten Zeile foobar am Anfang, gut, daß nicht, aber soll er das foo von foobar finden, oder das f oder das bar oder das ar oder das bla oder das r bl oder das .... Du siehst, es ist nicht eingrenzbar. Bernd -- ACK = ACKnowledge = Zustimmung | NAC = No ACknowledge = keine Zustimmung DAU = Dümmster Anzunehmender User | LOL = Laughing Out Loud = Lautes Lachen IIRC = If I Remember Correctly = Falls ich mich richtig erinnere OT = Off Topic = Am Thema (der Liste) vorbei |Zufallssignatur 11
![](https://seccdn.libravatar.org/avatar/e832594709d2f3e981e8ad5c26c52588.jpg?s=120&d=mm&r=g)
Am Thursday 04 September 2003 11:40 schrieb Bernd Brodesser:
* Martin Borchert schrieb am 04.Sep.2003:
Am Thursday 04 September 2003 02:23 schrieb Thomas Preissler:
Gegeben sei folgendes: -------- foobar blabla... ofobar blabla... oofbar blabla... oobfar blabla... oobafr blabla... oobarf blabla... foboar blabla... ... -------- Wie müsste ein regulärer Ausdruck aussehen, dass er alles matcht, aber nicht die Zeilen, in denen 'foobar' am Anfang steht. Das kann nicht funktionieren. Was soll er denn alles finden? Er findet doch in der ersten Zeile foobar am Anfang, gut, daß nicht, aber soll er das foo von foobar finden, oder das f oder das bar oder das ar oder das bla oder das r bl oder das ....
Er soll alles finden, es sei denn, am Anfang steht 'foobar'.
Du siehst, es ist nicht eingrenzbar.
Ja, den Eindruck hatte ich heute Nacht auch. Konnte mir das aber nicht vorstellen. Ich lebte bis ungefähr heute morgen um 2 in der Traumwelt, dass man mit RegExen in perl/php alles machen könnte. Mal etwas spezifischer: Ich suchte nach etwas in der Richtung /^([^foobar]) .*$/blabla/ Wobei aber foobar als eine Zeichen_kette_ und nicht als Zeichen_klasse_ interpretiert werden soll. Also wenn das erste Wort ein anderes ist als 'foobar' soll es durch 'blabla' ersetzt werden. Martin -- when in danger or in doubt, run in circles, scream and shout! pgp-key: via wwwkeys.de.pgp.net, key id is 0x21eec9b0
![](https://seccdn.libravatar.org/avatar/3315311bb8e9e2e94780da1ac1b7f51d.jpg?s=120&d=mm&r=g)
Hallo Martin, * Martin schrieb am 04.09.2003:
Am Thursday 04 September 2003 11:40 schrieb Bernd Brodesser:
* Martin Borchert schrieb am 04.Sep.2003:
Am Thursday 04 September 2003 02:23 schrieb Thomas Preissler:
Gegeben sei folgendes: -------- foobar blabla... ofobar blabla... oofbar blabla... oobfar blabla... oobafr blabla... oobarf blabla... foboar blabla... ... -------- Wie müsste ein regulärer Ausdruck aussehen, dass er alles matcht, aber nicht die Zeilen, in denen 'foobar' am Anfang steht. Das kann nicht funktionieren. Was soll er denn alles finden? Er findet doch in der ersten Zeile foobar am Anfang, gut, daß nicht, aber soll er das foo von foobar finden, oder das f oder das bar oder das ar oder das bla oder das r bl oder das ....
Er soll alles finden, es sei denn, am Anfang steht 'foobar'.
Du siehst, es ist nicht eingrenzbar.
Ja, den Eindruck hatte ich heute Nacht auch. Konnte mir das aber nicht vorstellen. Ich lebte bis ungefähr heute morgen um 2 in der Traumwelt, dass man mit RegExen in perl/php alles machen könnte.
Mal etwas spezifischer: Ich suchte nach etwas in der Richtung /^([^foobar]) .*$/blabla/ Wobei aber foobar als eine Zeichen_kette_ und nicht als Zeichen_klasse_ interpretiert werden soll. Also wenn das erste Wort ein anderes ist als 'foobar' soll es durch 'blabla' ersetzt werden.
Ein solchen RegEx wirst Du nicht finden, bzw. den gibt es nicht. Wie Bernd schon geschrieben hat, die Möglichkeiten wären unendlich, und da gibt's keinen RegEx dafür. Ein RegEx ist nur ein endlicher Automat, da das Alphabet auch endlich ist. Du kannst Dir nur behelfen, indem Du überprüfst ob "foobar" am Anfang steht, und wenn nicht, dass dann weitergehende Aktionen geschehen. Grüße, Tom
![](https://seccdn.libravatar.org/avatar/e832594709d2f3e981e8ad5c26c52588.jpg?s=120&d=mm&r=g)
Am Thursday 04 September 2003 13:54 schrieb Thomas Preissler:
* Martin schrieb am 04.09.2003:
Mal etwas spezifischer: Ich suchte nach etwas in der Richtung /^([^foobar]) .*$/blabla/ Wobei aber foobar als eine Zeichen_kette_ und nicht als Zeichen_klasse_ interpretiert werden soll. Also wenn das erste Wort ein anderes ist als 'foobar' soll es durch 'blabla' ersetzt werden. Ein solchen RegEx wirst Du nicht finden, bzw. den gibt es nicht. Wie Bernd schon geschrieben hat, die Möglichkeiten wären unendlich, und da gibt's keinen RegEx dafür. Ein RegEx ist nur ein endlicher Automat, da das Alphabet auch endlich ist.
Ähm... Sorry, das verstehe ich nicht. Vielleicht habe ich da gerade ein ziemlich dickes Brett vor dem Kopf. Wieso sind die Möglichkeiten unendlich? Worin würde der wesentliche Unterschied zwischen /[^abc]/ als Charakterklasse oder /[^(abc)]/ als Zeichenkette in Bezug auf (Un-)Endlichkeit bestehen?
Du kannst Dir nur behelfen, indem Du überprüfst ob "foobar" am Anfang steht, und wenn nicht, dass dann weitergehende Aktionen geschehen.
Aha, da kommen wir dem doch näher. 'foobar' am Anfang ist einfach: /^(foobar).*$/ Wenn $1 leer ist, steht offenbar kein 'foobar' am Anfang. Und nun? Martin -- when in danger or in doubt, run in circles, scream and shout! pgp-key: via wwwkeys.de.pgp.net, key id is 0x21eec9b0
![](https://seccdn.libravatar.org/avatar/3315311bb8e9e2e94780da1ac1b7f51d.jpg?s=120&d=mm&r=g)
Hallo Martin, * Martin schrieb am 04.09.2003:
Am Thursday 04 September 2003 13:54 schrieb Thomas Preissler:
* Martin schrieb am 04.09.2003:
Mal etwas spezifischer: Ich suchte nach etwas in der Richtung /^([^foobar]) .*$/blabla/ Wobei aber foobar als eine Zeichen_kette_ und nicht als Zeichen_klasse_ interpretiert werden soll. Also wenn das erste Wort ein anderes ist als 'foobar' soll es durch 'blabla' ersetzt werden. Ein solchen RegEx wirst Du nicht finden, bzw. den gibt es nicht. Wie Bernd schon geschrieben hat, die Möglichkeiten wären unendlich, und da gibt's keinen RegEx dafür. Ein RegEx ist nur ein endlicher Automat, da das Alphabet auch endlich ist.
Ähm... Sorry, das verstehe ich nicht. Vielleicht habe ich da gerade ein ziemlich dickes Brett vor dem Kopf. Wieso sind die Möglichkeiten unendlich? Worin würde der wesentliche Unterschied zwischen /[^abc]/ als Charakterklasse oder /[^(abc)]/ als Zeichenkette in Bezug auf (Un-)Endlichkeit bestehen?
[...] ist immer eine Zeichenklasse, es kann nicht als Zeichenkette interpretiert werden. Da das nicht geht, musst Du alle anderen, erlaubten, Zeichenketten angeben und deren Anzahl ist in Prinzip unendlich.
Du kannst Dir nur behelfen, indem Du überprüfst ob "foobar" am Anfang steht, und wenn nicht, dass dann weitergehende Aktionen geschehen.
Aha, da kommen wir dem doch näher. 'foobar' am Anfang ist einfach: /^(foobar).*$/ Wenn $1 leer ist, steht offenbar kein 'foobar' am Anfang. Und nun?
Ich soll Dir sagen, was Du damit machen musst? Ich zitiere:
Also wenn das erste Wort ein anderes ist als 'foobar' soll es durch 'blabla' ersetzt werden. Wer hat das wohl geschrieben?
Nein, ich schreibe nicht, dass das eine dumme Frage ist. Grüße, Tom
![](https://seccdn.libravatar.org/avatar/e832594709d2f3e981e8ad5c26c52588.jpg?s=120&d=mm&r=g)
Am Thursday 04 September 2003 15:52 schrieb Thomas Preissler:
Hallo Martin, * Martin schrieb am 04.09.2003:
Am Thursday 04 September 2003 13:54 schrieb Thomas Preissler:
* Martin schrieb am 04.09.2003:
Mal etwas spezifischer: Ich suchte nach etwas in der Richtung /^([^foobar]) .*$/blabla/ Wobei aber foobar als eine Zeichen_kette_ und nicht als Zeichen_klasse_ interpretiert werden soll. Also wenn das erste Wort ein anderes ist als 'foobar' soll es durch 'blabla' ersetzt werden. Ein solchen RegEx wirst Du nicht finden, bzw. den gibt es nicht. Wie Bernd schon geschrieben hat, die Möglichkeiten wären unendlich, und da gibt's keinen RegEx dafür. Ein RegEx ist nur ein endlicher Automat, da das Alphabet auch endlich ist. Ähm... Sorry, das verstehe ich nicht. Vielleicht habe ich da gerade ein ziemlich dickes Brett vor dem Kopf. Wieso sind die Möglichkeiten unendlich? Worin würde der wesentliche Unterschied zwischen /[^abc]/ als Charakterklasse oder /[^(abc)]/ als Zeichenkette in Bezug auf (Un-)Endlichkeit bestehen?
Wir reden aneinander vorbei.
[...] ist immer eine Zeichenklasse,
Richtig.
es kann nicht als Zeichenkette interpretiert werden.
komma weil [ ] es die gängigen Implementierungen nicht hergeben [ ] es prinzipiell unmöglich ist Wo würdest du Kreuzchen setzen?
Du kannst Dir nur behelfen, indem Du überprüfst ob "foobar" am Anfang steht, und wenn nicht, dass dann weitergehende Aktionen geschehen. Aha, da kommen wir dem doch näher. 'foobar' am Anfang ist einfach: /^(foobar).*$/ Wenn $1 leer ist, steht offenbar kein 'foobar' am Anfang. Und nun? Ich soll Dir sagen, was Du damit machen musst?
Nein, _was_ ich damit machen will, ist mir klar. Mir ging es eher um das _wie_. Aber, TIMTOWTDI sei dank, hat sich mein vordergründiges Problem gelöst. Martin -- when in danger or in doubt, run in circles, scream and shout! pgp-key: via wwwkeys.de.pgp.net, key id is 0x21eec9b0
![](https://seccdn.libravatar.org/avatar/3315311bb8e9e2e94780da1ac1b7f51d.jpg?s=120&d=mm&r=g)
Hallo Martin, * Martin schrieb am 04.09.2003:
Am Thursday 04 September 2003 15:52 schrieb Thomas Preissler:
Hallo Martin, * Martin schrieb am 04.09.2003:
Am Thursday 04 September 2003 13:54 schrieb Thomas Preissler:
* Martin schrieb am 04.09.2003:
Mal etwas spezifischer: Ich suchte nach etwas in der Richtung /^([^foobar]) .*$/blabla/ Wobei aber foobar als eine Zeichen_kette_ und nicht als Zeichen_klasse_ interpretiert werden soll. Also wenn das erste Wort ein anderes ist als 'foobar' soll es durch 'blabla' ersetzt werden. Ein solchen RegEx wirst Du nicht finden, bzw. den gibt es nicht. Wie Bernd schon geschrieben hat, die Möglichkeiten wären unendlich, und da gibt's keinen RegEx dafür. Ein RegEx ist nur ein endlicher Automat, da das Alphabet auch endlich ist. Ähm... Sorry, das verstehe ich nicht. Vielleicht habe ich da gerade ein ziemlich dickes Brett vor dem Kopf. Wieso sind die Möglichkeiten unendlich? Worin würde der wesentliche Unterschied zwischen /[^abc]/ als Charakterklasse oder /[^(abc)]/ als Zeichenkette in Bezug auf (Un-)Endlichkeit bestehen?
Wir reden aneinander vorbei.
[...] ist immer eine Zeichenklasse,
Richtig.
es kann nicht als Zeichenkette interpretiert werden.
komma weil [ ] es die gängigen Implementierungen nicht hergeben [ ] es prinzipiell unmöglich ist
Wo würdest du Kreuzchen setzen?
IMHO haben Standard-RegExe dies nicht implementiert, da es nicht definiert ist. [x] es die gängigen Implementierungen nicht hergeben Vielleicht wird man bei anderen RegEx-Dialekten fündig... [...] Grüße, Tom
![](https://seccdn.libravatar.org/avatar/e832594709d2f3e981e8ad5c26c52588.jpg?s=120&d=mm&r=g)
Am Thursday 04 September 2003 14:20 schrieb Peter Wiersig:
Martin Borchert wrote:
Mal etwas spezifischer: Ich suchte nach etwas in der Richtung /^([^foobar]) .*$/blabla/ Noch die [] weg und das koennte klappen. Hm, nach dem "Regular Expression Editor" aus KDE sieht dein Ausdruck so aus: ^(?!foobar)
Negative Look-Ahead... Mal sehen, ob ich das verstehe. Martin -- when in danger or in doubt, run in circles, scream and shout! pgp-key: via wwwkeys.de.pgp.net, key id is 0x21eec9b0
![](https://seccdn.libravatar.org/avatar/2a347b18c06ada0bdb2501b5a3e9a8cf.jpg?s=120&d=mm&r=g)
Moin,
* Bernd Brodesser
Das kann nicht funktionieren.
Funktioniert aber.
Du siehst, es ist nicht eingrenzbar.
Es ist schon eingrenzbar, warum auch nicht? 'Finde alle Zeilen, die blabla enthalten, aber nicht mit foobar anfangen.' Geht doch. Thorsten -- The liberty of a democracy is not safe if the people tolerate the growth of private power to the point where it becomes stronger than the democratic state itself. That in its essence is fascism - ownership of government by an individual, by a group or any controlling private power. - Franklin D. Roosevelt
![](https://seccdn.libravatar.org/avatar/c65f0a9d70486d425ffd4799ddb379fc.jpg?s=120&d=mm&r=g)
* Thorsten Haude schrieb am 06.Sep.2003:
* Bernd Brodesser
[2003-09-04 11:40]: Das kann nicht funktionieren.
Funktioniert aber.
Du siehst, es ist nicht eingrenzbar.
Es ist schon eingrenzbar, warum auch nicht? 'Finde alle Zeilen, die blabla enthalten, aber nicht mit foobar anfangen.' Geht doch.
Ein RegEx findet keine Zeilen, sondern Textpassagen. Wenn Du z.B foo bar baz hast und alles suchst, wo foo nicht drin vorkommt, so findet der RegEx f fo o oo oo oo b oo ba oo bar oo bar oo bar b oo bar ba oo bar baz o o o b ... b ba baz a az z Ein bischen viel, oder nicht? Bernd
![](https://seccdn.libravatar.org/avatar/2a347b18c06ada0bdb2501b5a3e9a8cf.jpg?s=120&d=mm&r=g)
Moin,
* Bernd Brodesser
* Thorsten Haude schrieb am 06.Sep.2003:
* Bernd Brodesser
[2003-09-04 11:40]: Du siehst, es ist nicht eingrenzbar.
Es ist schon eingrenzbar, warum auch nicht? 'Finde alle Zeilen, die blabla enthalten, aber nicht mit foobar anfangen.' Geht doch.
Ein RegEx findet keine Zeilen, sondern Textpassagen.
Dann aber Textpassagen, die einen Zeilenanfang und ein Zeilenende enthalten.
Ein bischen viel, oder nicht?
Ich kann Dir nicht folgen. Thorsten -- I believe that there are more instances of the abridgment of the freedom of the people by gradual and silent encroachment than by violent and sudden usurpations. - James Madison
![](https://seccdn.libravatar.org/avatar/c65f0a9d70486d425ffd4799ddb379fc.jpg?s=120&d=mm&r=g)
* Thorsten Haude schrieb am 06.Sep.2003:
Moin,
* Bernd Brodesser
[2003-09-06 03:52]: * Thorsten Haude schrieb am 06.Sep.2003:
* Bernd Brodesser
[2003-09-04 11:40]: Du siehst, es ist nicht eingrenzbar.
Es ist schon eingrenzbar, warum auch nicht? 'Finde alle Zeilen, die blabla enthalten, aber nicht mit foobar anfangen.' Geht doch.
Ein RegEx findet keine Zeilen, sondern Textpassagen.
Dann aber Textpassagen, die einen Zeilenanfang und ein Zeilenende enthalten.
Nö, wieso? Kann, aber muß nicht sein.
Ein bischen viel, oder nicht?
Ich kann Dir nicht folgen.
Nimm doch mal als Beispiel: s/^!(foo)/bar/ Hierbei soll !(foo) das erwähnte nicht foo bedeuten. Der ^ steht wie gewohnt für den Zeilenanfang. Laß da mal foobaz drüber laufen. Was passiert denn wohl? Da steht zwar foo am Anfang, aber es steht auch fo oder f am Anfang und das ist nicht foo. Also wird doch das f, am Zeilenanfang, daß ja nicht foo ist durch bar ersetzt und Du erhälst baroobaz und das ist doch nicht gewollt. Noch wahrscheinlicher wäre es, wenn die leere Zeichenkette am Zeilenanfang ersetzt würde. Die Zeichenkette muß ja nicht die gleiche Länge haben. Bernd -- Alle meine Signaturen sind rein zufällig und haben nichts mit dem Text oder dem Schreiber zu tun, dem ich antworte. Falls irgendwelche Unrichtigkeiten dabei sein sollten, so bedauere ich das. Es wäre nett, wenn Du mich benachrichtigen würdest. |Zufallssignatur 0
![](https://seccdn.libravatar.org/avatar/2a347b18c06ada0bdb2501b5a3e9a8cf.jpg?s=120&d=mm&r=g)
Moin,
* Bernd Brodesser
* Thorsten Haude schrieb am 06.Sep.2003:
* Bernd Brodesser
[2003-09-06 03:52]: * Thorsten Haude schrieb am 06.Sep.2003:
* Bernd Brodesser
[2003-09-04 11:40]: Du siehst, es ist nicht eingrenzbar.
Es ist schon eingrenzbar, warum auch nicht? 'Finde alle Zeilen, die blabla enthalten, aber nicht mit foobar anfangen.' Geht doch.
Ein RegEx findet keine Zeilen, sondern Textpassagen.
Dann aber Textpassagen, die einen Zeilenanfang und ein Zeilenende enthalten.
Nö, wieso? Kann, aber muß nicht sein.
Ach, jetzt verstehe ich, worauf Du hinaus willst. Jaja, es sind Textpassagen. Ist das für das Problem entscheidend?
Ein bischen viel, oder nicht?
Ich kann Dir nicht folgen.
Nimm doch mal als Beispiel:
s/^!(foo)/bar/
Hierbei soll !(foo) das erwähnte nicht foo bedeuten. Der ^ steht wie gewohnt für den Zeilenanfang. Laß da mal foobaz drüber laufen. Was passiert denn wohl? Da steht zwar foo am Anfang, aber es steht auch fo oder f am Anfang und das ist nicht foo. Also wird doch das f, am Zeilenanfang, daß ja nicht foo ist durch bar ersetzt und Du erhälst baroobaz und das ist doch nicht gewollt.
Darum macht man es mit look-ahead oder look-behind. Damit kannst Du nicht-atomare Bedingungen stellen, die dann keine Zeichen verbrauchen, aber mehrere Zeichen überprüfen können. Mit einem negativen look-behind klappt es, jedenfalls soweit es das ursprüngliche Beispiel angeht. Mit einem negativen look-ahead kann man Dein Problem lösen: ^(?!foo) Das scheint zu funktionieren, barbar wird gefunden, foobar nicht. Thorsten -- Ein Staat, der die Wuerde des Menschen oder die körperliche Unversehrtheit nicht achtet, macht das nicht lange, wenn es noch Meinungsfreiheit gibt. Umgekehrt zieht die Abschaffung der Meinungsfreiheit aber die Abschaffung anderer Menschenrechte zwangsläufig nach sich. - Rolf Weber
![](https://seccdn.libravatar.org/avatar/3315311bb8e9e2e94780da1ac1b7f51d.jpg?s=120&d=mm&r=g)
Hallo Bernd, * Bernd schrieb am 07.09.2003:
* Thorsten Haude schrieb am 06.Sep.2003:
Moin,
* Bernd Brodesser
[2003-09-06 03:52]: * Thorsten Haude schrieb am 06.Sep.2003:
* Bernd Brodesser
[2003-09-04 11:40]: Du siehst, es ist nicht eingrenzbar.
Es ist schon eingrenzbar, warum auch nicht? 'Finde alle Zeilen, die blabla enthalten, aber nicht mit foobar anfangen.' Geht doch.
Ein RegEx findet keine Zeilen, sondern Textpassagen.
Dann aber Textpassagen, die einen Zeilenanfang und ein Zeilenende enthalten.
Nö, wieso? Kann, aber muß nicht sein.
Ein bischen viel, oder nicht?
Ich kann Dir nicht folgen.
Nimm doch mal als Beispiel:
s/^!(foo)/bar/
Hierbei soll !(foo) das erwähnte nicht foo bedeuten. Der ^ steht wie gewohnt für den Zeilenanfang. Laß da mal foobaz drüber laufen. Was passiert denn wohl? Da steht zwar foo am Anfang, aber es steht auch fo oder f am Anfang und das ist nicht foo. Also wird doch das f, am Zeilenanfang, daß ja nicht foo ist durch bar ersetzt und Du erhälst baroobaz und das ist doch nicht gewollt. Noch wahrscheinlicher wäre es, wenn die leere Zeichenkette am Zeilenanfang ersetzt würde.
Die Zeichenkette muß ja nicht die gleiche Länge haben.
Soweit ich weiß, arbeiten RegExes standardmäßig im Greedy-Modus, d.h. es wird soviel gematcht, wie möglich. Beim obigen Ausdruck passt es, dieser Ausdruck matcht auf "raboof". Warum sollte obiger Ausdruck denn auf ein einzelnes "f" matchen? Es sind auch noch runde Klammern da und da wird das Ganze "foo" genommen. Grüße, Tom
![](https://seccdn.libravatar.org/avatar/2a347b18c06ada0bdb2501b5a3e9a8cf.jpg?s=120&d=mm&r=g)
Moin,
* Martin Borchert
nachdem ich mich jetzt eine Weile mit O'Reilly, Google und diversen manpages beschäftigt habe und trotzdem zu keiner Lösung gekommen bin, muss ich jetzt mal hier nerven.
Gegeben sei folgendes:
-------- foobar blabla... ofobar blabla... oofbar blabla... oobfar blabla... oobafr blabla... oobarf blabla... foboar blabla... ... --------
Wie müsste ein regulärer Ausdruck aussehen, dass er alles matcht, aber nicht die Zeilen, in denen 'foobar' am Anfang steht.
Bei NEdit so: (?
![](https://seccdn.libravatar.org/avatar/e832594709d2f3e981e8ad5c26c52588.jpg?s=120&d=mm&r=g)
Am Saturday 06 September 2003 00:16 schrieb Thorsten Haude:
* Martin Borchert
[2003-09-04 01:56]:
Wie müsste ein regulärer Ausdruck aussehen, dass er alles matcht, aber nicht die Zeilen, in denen 'foobar' am Anfang steht. Bei NEdit so: (?
Ja, das hab ich mir auch gedacht. Geht aber nicht. Aus dem einfachen Grund: ^ wird nur hinter [ als Negation betrachtet. Martin -- when in danger or in doubt, run in circles, scream and shout! pgp-key: via wwwkeys.de.pgp.net, key id is 0x21eec9b0
![](https://seccdn.libravatar.org/avatar/2a347b18c06ada0bdb2501b5a3e9a8cf.jpg?s=120&d=mm&r=g)
Moin,
* Martin Borchert
Am Saturday 06 September 2003 00:16 schrieb Thorsten Haude:
* Martin Borchert
[2003-09-04 01:56]: Wie müsste ein regulärer Ausdruck aussehen, dass er alles matcht, aber nicht die Zeilen, in denen 'foobar' am Anfang steht. Bei NEdit so: (?
Ja, das hab ich mir auch gedacht. Geht aber nicht. Aus dem einfachen Grund: ^ wird nur hinter [ als Negation betrachtet.
Das ^ steht hier für den Zeilenanfang. Die Negation erledigt das negative look-behind: (?
participants (6)
-
B.Brodesser@t-online.de
-
Martin Borchert
-
Michael Siefritz
-
Peter Wiersig
-
Thomas Preissler
-
Thorsten Haude