Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Regular Expressions: match if not match

ajv [20.12.2005 07:14:43]

#

Useasti tartten regexp-lauseessa ehtoa, että haetaan merkkijonoa, jossa ei esiinny jotain toista merkkijonoa. Otetaan nyt tämänaamuinen ongelma esimerkiksi: etsin kaikkia php-tiedostoja, mutta ei niitä, jotka ovat hakemistossa 'foo'. Eli varmaan ihan simppeli perusjuttu, mutta nämä regexpit eivät ole ikinä olleet se vanhvin puoleni.

find | grep -P "(foo\/?)(.*)(\.php)$"

Ei aukene niin ei aukene :(

_Pete_ [20.12.2005 11:18:05]

#

grep:ssä on parametri:

-v, --invert-match

find | grep -vP "foo/" | grep -P "php$"

Ei välttämättä mene ihan oikein mutta tuohon tyyliin

eli eka grep päästää läpi kaikki rivit paitsi missä on foo/

ja tokassa näistä jäljelle jääneistä matchataan php päättyvät rivit.

ajv [20.12.2005 12:50:35]

#

Kiitokset tuosta -v:stä. Tuolla saan todennäköisesti tuon aamuisen ongelmani ratkaistua, mutta edelleen kiinnostaisi miten tuo hoidettaisiin yhdellä regexp-lauseella. Eikö regexpeissä ole joku "jos_ehto_toteutuu_hypätään_pois"-toiminto?

_Pete_ [21.12.2005 09:02:55]

#

ajv kirjoitti:

Kiitokset tuosta -v:stä. Tuolla saan todennäköisesti tuon aamuisen ongelmani ratkaistua, mutta edelleen kiinnostaisi miten tuo hoidettaisiin yhdellä regexp-lauseella. Eikö regexpeissä ole joku "jos_ehto_toteutuu_hypätään_pois"-toiminto?

Tarkemman pohdinnan tuloksena muistinkin että melkein vastaava on käytössä omassa bottiprojektissa eli:

".*(?<!Abstract)Cmd\\.class"

matchaa kaikkiin jotka päättyvä Cmd.class, muttei kuitenkaan AbstractCmd.class stringiin. Tätä soveltaen:

".*(?<!foo\/).*\.php^"

tai jotain siihen suuntaan voisi toimia... RegExpien opetteleuun/testailuun on kätevä tämä:

http://www.weitz.de/regex-coach/

ajv [21.12.2005 09:17:53]

#

Ja kiitokset taas :) Olin oikeilla jäljillä tuon kysymysmerkin kanssa, vaikka se olikin hieman väärässä paikassa... Luulen, että pääsen tuosta jo eteenpäin! Kiitokset vielä!

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta