2010-12-08 16 views
4

En utilisant l'expression rationnelle de style Perl, est-il possible de rechercher quelque chose qui ne soit pas certain?Comment utiliser l'expression régulière pour rechercher le quelque chose NON de certain motif

Par exemple, [^abc] semble un seul caractère non a ni b ni c.

Mais puis-je spécifier quelque chose de plus long qu'un seul caractère?
Par exemple, dans la chaîne suivante, je souhaite rechercher le premier mot qui n'est pas un nom de domaine de premier niveau et ne contient aucune lettre majuscule, ou peut-être des règles plus compliquées comme 3 à 10 caractères. Dans mon exemple, cela devrait être "abcd":

net com org edu ABCE abcdefghijklmnoparacbasd abcd 

Répondre

5

Vous pouvez le faire en utilisant des affirmations regard ahead négatives:

^(?!(?:net|com|org|edu)$)(?!.*[A-Z])[a-z]{3,10}$ 

See it

Explication:

^     - Start anchor 
$     - End anchor 
(?:net|com|org|edu) - Alternation, matches net or com or org or edu 
(?!regex)   - Negative lookahead. 
         Matches only if the string does not match the regex. 

Alors la partie (?!(?:net|com|org|edu)$) garantit que l'entrée n'est pas l'un des meilleurs leviers el domaines.

La partie (?!.*[A-Z]) garantit que l'entrée n'a pas de lettre majuscule.

La partie [a-z]{3,10}$ assure que l'entrée est de atleast de longueur 3 et atmost 10.

+0

il y a une grande vidéo qui explique regarder (et quelques discontinues effectuées par d'autres expressions régulières de base) ici: http://net.tutsplus.com/tutorials/other/comment-utiliser-lookaheads-et-lookbehinds-dans-vos-expressions-régulières/ – Haroldo

+0

Mieux utiliser le complément au lieu de '.':' (?! [^ AZ] * [AZ]) '. – Gumbo

4

Il suffit d'utiliser l'opérateur « correspond pas »: ~

Il suffit donc de créer votre expression, puis voir qu'une variable ne correspond pas:

if ($var !~ /abc/) { 
    ... 
} 
0

IMHO est plus facile à faire correspondre avec regexp et certains contrôles avec perl.

#!/usr/bin/env perl 

use strict; 
use warnings; 

my $s = "net com org edu ABCE abcdefghijklmnoparacbasd abcd"; 

# loop short words (a-z might not be what you want though) 
foreach($s =~ /(\b[a-z]{3,10}\b)/g){ 
    print $_, "\n" if is_tpl($_); 
} 

BTW, il y a beaucoup de domaines de premier niveau ..

+0

regarder à l'avance assertions ou simples regex négatifs sont plus efficaces alors ce –

+0

probablement .. à moins que le reg.exp plus simple est beaucoup plus rapide et il y a quelques "coups" .. Je suppose que cela ne sera souvent pas important –