🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: be.comp.programming
Article #4974

Re: Regex: hoe iets te excluden?

#4974
From: Gunter Schelfhout
Date: Tue, 27 May 2003 11:51
57 lines
2882 bytes
Walter Baeck wrote:

[knip]

> 
> Ik vermoed dat grep "[^(foo)]bar hetzelfde is als grep "[^foo]bar"
> onder de versie die ik gebruik. Als ik "man regexp" goed begrijp,
> dan betekent dit dat er gezocht wordt op een string van precies
> 4 karakters, van de vorm .bar waarbij er op het puntje geen letter
> mag staan die voorkomt tussen in de "exclude list" [^foo].

idd

> 
>> > Mijn oplossing zou dit monsterlijke gedrocht zijn:
>> >
>> > grep bar * | sed 's/foobar/ONGEWENST/g' | grep bar | sed
>> > 's/ONGEWENST/foobar/g'
>> >
>> > Hopelijk weet er iemand iets eleganter.
>> 
>> grep -ie "bar" <file>| grep -iv "foobar"
> 
> Dit lijkt me zeker niet de oplossing, aangezien O.P. vermeldde dat
>       blabla foobar bar blabla
> toch WEL moest gematchd worden. Juist, Roel ? Dat maakt het nu net
> zo moeilijk..

Je hebt gelijk. 

Maar deze Perl-oneliner doet w�l zijn werk zoals het moet. ;-)

perl -e 'while(<>) { print if m/(?<!foo)bar/i; }' <file>

Als <file> deze inhoud heeft:

Als bar in een zin voorkomt, moet
het gematcht worden.
Foobar in een zin, is geen match.
Als daarentegen foobar �n bar in een zin voorkomen,
dan is het weer wel geldig.
foobar
bar

Dit geeft:
Als bar in een zin voorkomt, moet
Als daarentegen foobar �n bar in een zin voorkomen,
bar

De regex is:
m/(?<!foo)bar/i

Dit betekent (in Perl, misschien ook in sed en andere) dat alle instanties 
van bar gematched worden zolang er g��n foo voorstaat. 
(?<!...) betekent "negative lookbehind".
-- 
Blood, sweat & tears
Technical Details
Message-ID: <yjIAa.21981$1u5.1831@afrodite.telenet-ops.be>
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-04!sn-xit-01!sn-xit-08!supernews.com!news.tele.dk!news.tele.dk!small.news.tele.dk!news-out.cwix.com!newsfeed.cwix.com!ossa.telenet-ops.be!afrodite.telenet-ops.be.POSTED!not-for-mail
References: <pXlza.15654$1u5.1208@afrodite.telenet-ops.be> <l8mza.15670$1u5.1346@afrodite.telenet-ops.be> <Afmza.15691$1u5.1402@afrodite.telenet-ops.be> <Vkmza.15706$1u5.1417@afrodite.telenet-ops.be> <3ED1EF43.F24F54DD@alcatel.be> <pQmAa.20289$1u5.1344@afrodite.telenet-ops.be> <3ED339E4.B9DFA679@alcatel.be>

Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII
X-Google-Thread: fcea4,42e50ad98d9b8861
X-Google-Attributes: gidfcea4,public
X-Google-ArrivalTime: 2003-05-27 04:52:07 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-04!sn-xit-01!sn-xit-08!supernews.com!news.tele.dk!news.tele.dk!small.news.tele.dk!news-out.cwix.com!newsfeed.cwix.com!ossa.telenet-ops.be!afrodite.telenet-ops.be.POSTED!not-for-mail
From: Gunter Schelfhout <nospam@please.com>
Subject: Re: Regex: hoe iets te excluden?
Newsgroups: be.comp.programming
References: <pXlza.15654$1u5.1208@afrodite.telenet-ops.be> <l8mza.15670$1u5.1346@afrodite.telenet-ops.be> <Afmza.15691$1u5.1402@afrodite.telenet-ops.be> <Vkmza.15706$1u5.1417@afrodite.telenet-ops.be> <3ED1EF43.F24F54DD@alcatel.be> <pQmAa.20289$1u5.1344@afrodite.telenet-ops.be> <3ED339E4.B9DFA679@alcatel.be>
Lines: 57
User-Agent: KNode/0.7.1
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-15
Content-Transfer-Encoding: 8Bit
Message-ID: <yjIAa.21981$1u5.1831@afrodite.telenet-ops.be>
Date: Tue, 27 May 2003 11:51:58 GMT
NNTP-Posting-Host: 213.118.153.61
X-Complaints-To: abuse@telenet.be
X-Trace: afrodite.telenet-ops.be 1054036318 213.118.153.61 (Tue, 27 May 2003 13:51:58 MET DST)
NNTP-Posting-Date: Tue, 27 May 2003 13:51:58 MET DST
Organization: Telenet Internet