2010-01-08 5 views
5

En Perl, quelle regex dois-je utiliser pour trouver si une chaîne de caractères a des lettres ou non? Exemple d'une chaîne utilisée: Thu Jan 1 05:30:00 1970Comment puis-je vérifier si une chaîne Perl contient des lettres?

Serait-ce bien?

if ($l =~ /[a-zA-Z]/) 
{ 
    print "string ";  
} 
else 
{  
    print "number ";  
} 
+0

Qu'est-ce que c'est «alphabet (s)»? Je suggère de donner un exemple de la chaîne que vous voulez faire correspondre. –

+4

Aaron: C'est une erreur commune pour les "lettres". Principalement des personnes d'origine indienne. – Joey

+0

qu'est-ce que tu veux faire avec la chaîne Thu Jan 1 05:30:00 1970? Je ne comprends pas vraiment. – ghostdog74

Répondre

14

essayez ceci:

/[a-zA-Z]/ 

ou

/[[:alpha:]]/ 

autrement, vous devez donner des exemples des chaînes que vous souhaitez correspondre.

également lire perldoc perlrequick

Edit: @OP, vous avez fourni chaîne par exemple, mais je ne suis pas vraiment sûr de ce que vous voulez faire avec elle. donc je suppose que vous voulez vérifier si un mot est toutes les lettres, tous les nombres ou quelque chose d'autre. voici quelque chose pour commencer. Tout de perldoc perlrequick (et perlretut) alors s'il vous plaît les lire.

sub check{ 
    my $str = shift; 
    if ($str =~ /^[a-zA-Z]+$/){ 
     return $str." all letters"; 
    } 
    if ($str =~ /^[0-9]+$/){ 
     return $str." all numbers"; 
    }else{ 
     return $str." a mix of numbers/letters/others"; 
    } 
} 

$string = "99932"; 
print check ($string)."\n"; 
$string = "abcXXX"; 
print check ($string)."\n"; 
$string = "9abd99_32"; 
print check ($string)."\n"; 

sortie

$ perl perl.pl 
99932 all numbers 
abcXXX all letters 
9abd99_32 a mix of numbers/letters/others 
+5

Le [a-zA-Z] adopte une vision particulièrement américaine des lettres. C'est un monde plus vaste. La classe de caractères POSIX serait mieux, mais la correspondance avec la propriété Unicode Letter est la même chose et plus facile à taper. :) –

+0

'/ [a-zA-z] /' <- le second z est probablement censé être mis en majuscule ('/ [a-zA-Z] /'), ou le premier 'az' devrait être omis (voir mon exemple) –

9

Si vous voulez faire correspondre les caractères Unicode plutôt que seulement ceux ASCII, essayez ceci:

#!/usr/bin/perl 

while (<>) { 
    if (/[\p{L}]+/) { 
    print "letters\n"; 
    } else { 
    print "no letters\n"; 
    } 
} 
5

Si vous cherchez une sorte de lettre de tout langue, vous devriez aller avec

\p{L} 

Jetez un oeil sur cette référence complète: Unicode Character Properties

0

L'utilisation de /[A-Za-z]/ est une méthode centrée sur les États-Unis. Pour accepter une lettre, utilisez une des

  • /[[:alpha:]]/
  • /\p{L}/
  • /[^\W\d_]/

Le troisième utilise un double négatif: non sans une lettre, pas un chiffre, et pas un trait de soulignement. Quel que soit votre choix, ceux qui conservent votre code apprécieront certainement que vous en conserviez un toujours!

0

Si vous cherchez à détecter si quelque chose ressemble à un nombre dans le but de le manipuler en Perl, vous aurez besoin de Scalar::Util :: looks_like_number (core depuis perl 5.7.3). De perlapi:

looks_like_number

Test si le contenu d'un SV ressemble comme un numéro (ou un nombre).Inf et Infinity sont traités comme des numéros (donc ne pas émettre un avertissement non numérique ), même si votre atof() ne les bloque pas .

Questions connexes