2011-06-04 8 views
2

Possible en double:
Regex to match vowels in order as they appear oncePerl regex voyelles correspondant

Cela correspond à des mots qui ont un a e i o u:

foreach $v(@lines) 
{ 
    if(($v =~ /a/) && ($v =~ /e/) && ($v =~ /i/) && ($v =~ /o/) && ($v =~ /u/)) 
    { 
     print $v; 
    } 
} 

Comment puis-je faire pour qu'elle corresponde à seulement dans l'ordre a e i o u? Par exemple, le mot abstemious correspondra.

+0

juste une suggestion, lexical la variable, tournez: 'foreach $ v (@lines)' en 'foreach mon $ v (@lines)' – snoofkin

+0

Quel est le bénéfice sur ce? Merci – Raskin

Répondre

4
$v =~/a.*e.*i.*o.*u/ 

Doit faire l'affaire.

+0

Feh. Tu m'as battu. :) J'ajouterai que pour des raisons d'efficacité, vous ne devriez faire cela qu'à l'intérieur de votre bloc "if" existant. –

+0

Alors qu'est-ce que le. et * fait cela rend cette sortie correctement? – Raskin

+0

@Raskin voir 'perldoc perlre'. Simplification: '.' correspond au caractère" any ",' * 'répète la correspondance précédente 0 ou plusieurs fois. – rohanpm

4

Une expression régulière « meilleure » peut être:

foreach (@lines) { 
    print $_ . "\n" if /\b[^aeiou]*a[^aeiou]*e[^aeiou]*i[^aeiou]*o[^aeiou]*u[^aeiou]*\b/i; 
} 

Cette garantit chaque voyelle apparaît qu'une seule fois et dans l'ordre.

  • \b moyens de limite de mot
  • [^aeiou]* signifie un nombre quelconque de non-voyelles. NB: Ceci correspondra également aux caractères non-alphabétiques tels que la ponctuation, les chiffres, etc.
  • i signifie insensible à la casse

C'est, vous obtenez des mots comme « bacterious » mais pas « pancreaticoduodenostomy » (qui comprend également toutes les voyelles dans l'ordre). Sinon, Peter Tillemans' answer est ce que vous voulez.