2010-01-08 32 views
5

In Perl, welche Regex sollte ich verwenden, um zu finden, ob eine Zeichenkette Buchstaben hat oder nicht? Beispiel für eine verwendete Zeichenfolge: Thu Jan 1 05:30:00 1970Wie kann ich überprüfen, ob eine Perl-Zeichenfolge Buchstaben enthält?

Wäre das in Ordnung?

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

Was ist "Alphabet (e)"? Ich schlage vor, ein Beispiel für die Zeichenfolge anzugeben, die Sie abgleichen möchten. –

+4

Aaron: Es ist ein häufiger Fehler für "Briefe". Meist von Menschen mit indischem Hintergrund. – Joey

+0

was willst du mit der Saite Thu Jan 1 05:30:00 1970 machen? Ich verstehe es nicht wirklich. – ghostdog74

Antwort

14

versuchen Sie dies:

/[a-zA-Z]/ 

oder

/[[:alpha:]]/ 

sonst, sollten Sie Beispiele für die Strings geben Sie abgleichen möchten.

lesen auch perldoc perlrequick

Edit: @OP, haben Sie zB Saite, aber ich bin nicht wirklich sicher, was Sie damit tun wollen. Ich gehe also davon aus, dass Sie überprüfen möchten, ob ein Wort alle Buchstaben, alle Zahlen oder etwas anderes ist. Hier ist etwas, mit dem ich anfangen soll. Alles von perldoc perlrequick (und perlretut) also lies sie bitte.

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"; 

Ausgang

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

Die [a-zA-Z] nimmt besonders amerikanische Blicke auf Buchstaben. Es ist eine größere Welt da draußen. Die POSIX-Zeichenklasse wäre besser, aber die Übereinstimmung mit der Unicode-Letter-Eigenschaft ist dasselbe und einfacher zu schreiben. :) –

+0

'/ [a-zA-z] /' <- das zweite z ist wahrscheinlich für die Oberschale gedacht ('/ [a-zA-Z] /'), oder das erste 'az' sollte weggelassen werden (siehe mein Beispiel) –

9

Wenn Sie eher Unicode-Zeichen passen als nur ASCII diejenigen, versuchen Sie dies:

#!/usr/bin/perl 

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

Wenn Sie sich für jede Art von Brief von jeder Suche Sprache, sollten Sie mit

gehen
\p{L} 

Werfen Sie einen Blick auf diese vollständige Referenz: Unicode Character Properties

0

Verwenden /[A-Za-z]/ ist eine US-zentrierte Möglichkeit, es zu tun. Um jeden Buchstaben zu akzeptieren, beschäftigt

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

verwenden Der dritte ein Doppel negativ: nicht not-a-Brief, keine Ziffer, und kein Unterstrich.

Welche auch immer Sie wählen, diejenigen, die Ihren Code pflegen, werden es sicherlich zu schätzen wissen, wenn Sie mit einem konsequent bleiben!

0

Wenn Sie herausfinden möchten, ob etwas aussieht wie eine Zahl, um es in Perl zu manipulieren, benötigen Sie Scalar::Util :: looks_like_number (Core seit Perl 5.7.3). Von perlapi:

looks_like_number

Testen Sie, ob der Inhalt eines SV wie eine Zahl aussieht (oder eine Zahl ist).Inf und Infinity werden als Nummern behandelt (so wird nicht eine nicht-numerische Warnung ausgegeben), auch wenn Ihr atof() nicht grok ihnen.

Verwandte Themen