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"| \
Akkor is működik, ha a a kereset karakter sorozat a legelején áll.
perl -pne 'print "x" if /^(?:(?!-al).)*$/'
al -al al
xal al al
Egyezzünk minden nap!
+jegyzések