QL.túra

Kulturális smörgåsbord Esterházytól Wass Albertig, a gumicsizmától az iPad-ig, a Teletabiktól Sexpírig, a makrofágtól a mikrokontrollerig, miazmás...

Címkék

2000 (20) 2001 (6) 2002 (16) 2003 (164) 2004 (61) 2005 (40) 2006 (31) 2007 (28) 2008 (33) 2009 (175) 2010 (188) 2011 (201) 2012 (86) 2013 (40) 2014 (36) 2015 (26) 2016 (10) adáshiba (91) android (1) animáció (93) cygwin (3) film (410) gezarol (13) hájtek (159) hangoskönyv (32) ipad (17) klip (12) könyv (191) linux (29) színház (169) vers (17) windows (37) zene (111) Címkefelhő

+jegyzések

Most ...

... múlok .osan

bmi_tiny.png


... hallgatom
Szabó Magda: Régimódi történet
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSqTmZEqlCRFgojyt52Q2n_qiMTyVlt-zJu-DpbNKVY6OQbBh4u


... olvasom
Alexander Steele (szerk.): Kezdő írók kézikönyve


... (Kik ezek? Kik ezek az embek? Kik ezek?)
profile for TrueY on Stack Exchange, a network of free, community-driven Q&A sites
free counters

[Hájtek] Negált regex perl-ben

2012.02.16. 11:00 | TrueY | Szólj hozzá!

Címkék: linux 2011 hájtek cygwin

Sokszor előforduló probléma, hogy olyan sorokat kell egy file-ban keresnünk, amely sorok egy adott karakter sorozatot NEM tartalmaznak. Bash-ban erre használhatjuk a "grep -v" parancsot. Tipikusan rossz használata a "grep ...| grep ... | grep -v ...|awk..." kelgyó! Kérem, hogy ezt egyetlen awk-ban oldjuk már meg!

Perl-ben használhatjuk a '!~' a nem illeszkedési feltételre, vagy az unless, ha az 'if'-fet akarjuk negálni. Előfordul viszont, hogy egy web-es felületen csak a regular expression-t tudjuk megadni és nincs lehetőségünk az if-fet, vagy a használt operátort módosítani.

Erre kellett megoldást találnom, hogy magában a reg.ex.-ben megadni a "nem illeszkedési" feltételt. A legjobb, amit találtam 3 perc guglizás után ("how to match a string which does not contain a given string in perl regexp") a következő:

/^(?:[^f]+|f(?!oo))*$/; # Matches strings not containing 'foo'.
/^(?:.(?!FOO).)*$/; # Matches strings not containing FOO

Nálam működik. "A zero-width negative look-ahead assertion"- használ. A második megnézni minden karakterre, hogy vajon a keresett string után jön-e a FOO karakter sorozat. Ha talál ilyet, akkor nem match-el. De átírható negative look-behind-re is, csak akkor a '.' elé kell tenni. Az első a gyorsabb verzió, de csak akkor igazán használható, ha az első karakter ritkán fordul elő.
echo -e "al -al al\nal al al"| \
perl -pne 'print "x" if /^(?:(?!-al).)*$/'
al -al al
xal al al
Akkor is működik, ha a  a kereset karakter sorozat a legelején áll.

Egyezzünk minden nap!

 

A bejegyzés trackback címe:

https://qltura.blog.hu/api/trackback/id/tr123389821

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása