🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: be.comp.programming
13 messages
13 total messages Started by Roel Schroeven Fri, 23 May 2003 09:35
Regex: hoe iets te excluden?
#5060
Author: Roel Schroeven
Date: Fri, 23 May 2003 09:35
27 lines
1621 bytes
Ik zou door een hele hoop files willen zoeken op 'bar', maar niet 'foobar'.

Dus

blabla foobar blabla

zou niet mogen matchen,
maar

blabla bar blabla
en zelfs
blabla foobar blabla bar blabla

zouden wel moeten matchen.

Zonder die laatste zou het gemakkelijk kunnen met grep bar | grep -v 
foobar, maar dat kan hier dus niet.

Ik heb al geprobeerd met

grep "\(foo\)\{0\}bar"

maar dat werkt niet: foobar wordt toch nog gematcht. Iemand een idee?

-- 
"Codito ergo sum"
Roel Schroeven
Re: Regex: hoe iets te excluden?
#5061
Author: Roel Schroeven
Date: Fri, 23 May 2003 09:44
14 lines
1497 bytes
Roel Schroeven wrote:

> Ik heb al geprobeerd met
> 
> grep "\(foo\)\{0\}bar"
> 
> maar dat werkt niet: foobar wordt toch nog gematcht. Iemand een idee?

grep "[^f][^o][^o]bar" doet het wel, maar ik zou denken dat het 
eleganter moet kunnen.

-- 
"Codito ergo sum"
Roel Schroeven
Re: Regex: hoe iets te excluden?
#5062
Author: Roel Schroeven
Date: Fri, 23 May 2003 09:47
20 lines
1886 bytes
Roel Schroeven wrote:

> Roel Schroeven wrote:
> 
>> Ik heb al geprobeerd met
>>
>> grep "\(foo\)\{0\}bar"
>>
>> maar dat werkt niet: foobar wordt toch nog gematcht. Iemand een idee?
> 
> 
> grep "[^f][^o][^o]bar" doet het wel, maar ik zou denken dat het 
> eleganter moet kunnen.

Het werkt zelfs niet helemaal: als bar aan het begin van de lijn staat 
gaat het fout.

-- 
"Codito ergo sum"
Roel Schroeven
Re: Regex: hoe iets te excluden?
#5063
Author: Gunter Schelfhout
Date: Fri, 23 May 2003 09:49
19 lines
1522 bytes
Roel Schroeven wrote:

[knip]

> Ik heb al geprobeerd met
> 
> grep "\(foo\)\{0\}bar"
> 
> maar dat werkt niet: foobar wordt toch nog gematcht. Iemand een idee?
> 

grep "\bbar\b" 

\b -> wordboundary

Dus grep gaat nu greppen op het woord bar slechts als dit voorkomt als een 
zelfstandig woord.
-- 
Blood, sweat & tears
Re: Regex: hoe iets te excluden?
#5064
Author: Roel Schroeven
Date: Fri, 23 May 2003 09:56
29 lines
1973 bytes
Gunter Schelfhout wrote:

> Roel Schroeven wrote:
> 
> [knip]
> 
> 
>>Ik heb al geprobeerd met
>>
>>grep "\(foo\)\{0\}bar"
>>
>>maar dat werkt niet: foobar wordt toch nog gematcht. Iemand een idee?
>>
> 
> 
> grep "\bbar\b" 
> 
> \b -> wordboundary
> 
> Dus grep gaat nu greppen op het woord bar slechts als dit voorkomt als een 
> zelfstandig woord.

Het zou ook moeten matchen als het in een woord voorkomt. Of in het 
begin van een regel, of op het einde, of allebei; altijd eigenlijk, 
alleen niet als 'foo' er vlak voor staat.

-- 
"Codito ergo sum"
Roel Schroeven
Re: Regex: hoe iets te excluden?
#5065
Author: Gunter Schelfhout
Date: Fri, 23 May 2003 10:02
22 lines
1664 bytes
Roel Schroeven wrote:

[knip]

>> 
>> grep "\bbar\b"
>> 
>> \b -> wordboundary
>> 
>> Dus grep gaat nu greppen op het woord bar slechts als dit voorkomt als
>> een zelfstandig woord.
> 
> Het zou ook moeten matchen als het in een woord voorkomt. Of in het
> begin van een regel, of op het einde, of allebei; altijd eigenlijk,
> alleen niet als 'foo' er vlak voor staat.

Dat is niet wat uw voorbeeld weergaf. ;-)

grep "[^(foo)]bar"

-- 
Blood, sweat & tears
Re: Regex: hoe iets te excluden?
#5066
Author: Roel Schroeven
Date: Fri, 23 May 2003 10:05
31 lines
2282 bytes
Gunter Schelfhout wrote:

> Roel Schroeven wrote:
> 
> [knip]
> 
> 
>>>grep "\bbar\b"
>>>
>>>\b -> wordboundary
>>>
>>>Dus grep gaat nu greppen op het woord bar slechts als dit voorkomt als
>>>een zelfstandig woord.
>>
>>Het zou ook moeten matchen als het in een woord voorkomt. Of in het
>>begin van een regel, of op het einde, of allebei; altijd eigenlijk,
>>alleen niet als 'foo' er vlak voor staat.
> 
> 
> Dat is niet wat uw voorbeeld weergaf. ;-)

Ik had er spaties rondgezet voor de 'duidelijkheid', maar achteraf 
bekeken was dat toch niet zo duidelijk :)

> grep "[^(foo)]bar"

Zooo simpel ... ik had het moeten weten ...

-- 
"Codito ergo sum"
Roel Schroeven
Re: Regex: hoe iets te excluden?
#4967
Author: Walter Baeck
Date: Mon, 26 May 2003 10:41
35 lines
2263 bytes
> >> grep "\bbar\b"
> >>
> >> \b -> wordboundary

Werkte dit ook niet met 
     grep '\<bar\>'     ?

Maar, zoals OP al zei, zoeken op woord-boundaries is hier geen oplossing.

 
> grep "[^(foo)]bar"

Bij mij werkt dit niet (opgeroepen vanuit csh, Solaris 5.8, 
zowel /bin/grep als /usr/xpg4/bin/grep ). De ronde haakjes
worden namelijk als eerste geevalueerd, zodat het resultaat
hetzelfde wordt als voor
    grep "[^foo]bar"
wat leidt tot problemen:
 - bar aan begin van regel wordt niet weerhouden
 - bv. "fuifbar" wordt onterecht geweigerd

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.

-- 
  ____________         
  \          /    Walter Baeck
   \ ALCATEL/     Alcatel Telecom
    \ BELL /      Broadband Networks Division 
     \    /       Microelectronics Design 
      \  /        E-mail  : walter.baeck@alcatel.be     
       \/         Phone   : +32 3  240 73 86
Re: Regex: hoe iets te excluden?
#4968
Author: Roel Schroeven
Date: Mon, 26 May 2003 10:46
33 lines
2357 bytes
Walter Baeck wrote:

>>>>grep "\bbar\b"
>>>>
>>>>\b -> wordboundary
> 
> 
> Werkte dit ook niet met 
>      grep '\<bar\>'     ?
> 
> Maar, zoals OP al zei, zoeken op woord-boundaries is hier geen oplossing.
> 
>  
> 
>>grep "[^(foo)]bar"
> 
> 
> Bij mij werkt dit niet (opgeroepen vanuit csh, Solaris 5.8, 
> zowel /bin/grep als /usr/xpg4/bin/grep ). De ronde haakjes
> worden namelijk als eerste geevalueerd, zodat het resultaat
> hetzelfde wordt als voor
>     grep "[^foo]bar"
> wat leidt tot problemen:
>  - bar aan begin van regel wordt niet weerhouden
>  - bv. "fuifbar" wordt onterecht geweigerd

Gelukkig werkt het bij mij wel, in de cygwin-versie van grep, en ook in 
de zoekfunctie van Borland C++Builder (maar dan in de gewijzigde versie 
[^{foo}]bar, hoewel Borland alleen nogal simpele expressions aankan.

-- 
"Codito ergo sum"
Roel Schroeven
Re: Regex: hoe iets te excluden?
#4969
Author: Gunter Schelfhout
Date: Mon, 26 May 2003 11:25
34 lines
2346 bytes
Walter Baeck wrote:

[knip]

> Bij mij werkt dit niet (opgeroepen vanuit csh, Solaris 5.8,
> zowel /bin/grep als /usr/xpg4/bin/grep ). De ronde haakjes
> worden namelijk als eerste geevalueerd, zodat het resultaat
> hetzelfde wordt als voor
>     grep "[^foo]bar"
> wat leidt tot problemen:
>  - bar aan begin van regel wordt niet weerhouden
>  - bv. "fuifbar" wordt onterecht geweigerd

Wij werken met de GNU-versie van grep en dan werkt het perfect.
Ik ken enkel wat van pattern matching die bij Perl toegepast wordt en her en 
der wat verschilt met bv sed en awk.
Bij Perl dienen de haakjes om karakters samen te voegen (en te capturen in 
de variabelen $1, $2, enz)

Blijkbaar denkt uw grep-versie er anders over en geldt dan de negatie van 
enkel de letter f. Van zodra een string begint met f, is het pattern reeds 
false.

> 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"
-- 
Blood, sweat & tears
Re: Regex: hoe iets te excluden?
#4970
Author: Walter Baeck
Date: Tue, 27 May 2003 10:11
57 lines
3445 bytes
> > grep "[^(foo)]bar"
> >
> > wat leidt tot problemen:
> >  - bar aan begin van regel wordt niet weerhouden
> >  - bv. "fuifbar" wordt onterecht geweigerd
> 
> Wij werken met de GNU-versie van grep en dan werkt het perfect.

Ik heb de raad van Kris De Decker gevolgd
(uit news:57388f65.0305171657.2f71e9ed@posting.google.com )
en Regex Coach geinstalleerd. Dit is dan blijkbaar niet kompatibel
met jullie GNU-versie van grep; net zoals wat ik in Solaris grep
observeer, faalt de match op de twee situaties die ik aanhaalde.


> Ik ken enkel wat van pattern matching die bij Perl toegepast wordt
> en her en der wat verschilt met bv sed en awk.
> Bij Perl dienen de haakjes om karakters samen te voegen
> (en te capturen in de variabelen $1, $2, enz)

Precies zoals ik het in Solaris sed gebruik.
Gelukkig hebben we toch nog ergens een gemeenschappelijk vertrekpunt :-)

 
> Blijkbaar denkt uw grep-versie er anders over en geldt dan de negatie van
> enkel de letter f. Van zodra een string begint met f, is het pattern reeds
> false.

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].


> > 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..

-- 
  ____________         
  \          /    Walter Baeck
   \ ALCATEL/     Alcatel Telecom
    \ BELL /      Broadband Networks Division 
     \    /       Microelectronics Design 
      \  /        E-mail  : walter.baeck@alcatel.be     
       \/         Phone   : +32 3  240 73 86
Re: Regex: hoe iets te excluden?
#4971
Author: Roel Schroeven
Date: Tue, 27 May 2003 10:35
64 lines
3750 bytes
Walter Baeck wrote:

>>>grep "[^(foo)]bar"
>>>
>>>wat leidt tot problemen:
>>> - bar aan begin van regel wordt niet weerhouden
>>> - bv. "fuifbar" wordt onterecht geweigerd
>>
>>Wij werken met de GNU-versie van grep en dan werkt het perfect.
> 
> 
> Ik heb de raad van Kris De Decker gevolgd
> (uit news:57388f65.0305171657.2f71e9ed@posting.google.com )
> en Regex Coach geinstalleerd. Dit is dan blijkbaar niet kompatibel
> met jullie GNU-versie van grep; net zoals wat ik in Solaris grep
> observeer, faalt de match op de twee situaties die ik aanhaalde.
> 
> 
> 
>>Ik ken enkel wat van pattern matching die bij Perl toegepast wordt
>>en her en der wat verschilt met bv sed en awk.
>>Bij Perl dienen de haakjes om karakters samen te voegen
>>(en te capturen in de variabelen $1, $2, enz)
> 
> 
> Precies zoals ik het in Solaris sed gebruik.
> Gelukkig hebben we toch nog ergens een gemeenschappelijk vertrekpunt :-)
> 
>  
> 
>>Blijkbaar denkt uw grep-versie er anders over en geldt dan de negatie van
>>enkel de letter f. Van zodra een string begint met f, is het pattern reeds
>>false.
> 
> 
> 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].
> 
> 
> 
>>>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..

Inderdaad. Gelukkug werkt [^(foo)] wel hier. Lastig toch, dat er zo veel 
verschillen zijn tussen verschillende regex-implementaties.

-- 
"Codito ergo sum"
Roel Schroeven
Re: Regex: hoe iets te excluden?
#4974
Author: 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
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads