2010-01-08 46 views
5

Trong Perl, tôi nên sử dụng regex nào để tìm chuỗi ký tự có chữ cái hay không? Ví dụ về chuỗi được sử dụng: Thu Jan 1 05:30:00 1970Làm cách nào để kiểm tra xem chuỗi Perl có chứa chữ cái không?

Điều này có ổn không?

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

"Bảng chữ cái" là gì? Tôi đề nghị đưa ra một ví dụ về chuỗi bạn muốn khớp. –

+4

Aaron: Đó là một sai lầm phổ biến cho "chữ cái". Chủ yếu là từ những người có nền Ấn Độ. – Joey

+0

bạn muốn làm gì với chuỗi Thu Jan 1 05:30:00 1970? Tôi thực sự không hiểu. – ghostdog74

Trả lời

14

thử điều này:

/[a-zA-Z]/ 

hoặc

/[[:alpha:]]/ 

nếu không, bạn nên cung cấp cho ví dụ về chuỗi bạn muốn kết hợp.

cũng đọc perldoc perlrequick

Edit: @OP, bạn đã cung cấp ví dụ chuỗi, nhưng tôi không thực sự chắc chắn những gì bạn muốn làm gì với nó. vì vậy tôi giả sử bạn muốn kiểm tra xem một từ là tất cả các chữ cái, tất cả các con số hay cái gì khác. đây là một cái gì đó để bắt đầu với. Tất cả từ perloc perlrequick (và perlretut) vì vậy xin vui lòng đọc chúng.

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

đầu ra

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

[a-zA-Z] có một cái nhìn đặc biệt của Mỹ đối với các chữ cái. Đó là một thế giới rộng lớn hơn ngoài kia. Lớp nhân vật POSIX sẽ tốt hơn, nhưng phù hợp với thuộc tính Thư Unicode cũng giống như vậy và dễ gõ hơn. :) –

+0

'/ [a-zA-z] /' <- z thứ hai có thể được đặt ở trên ('/ [a-zA-Z] /'), hoặc «az' đầu tiên cần được bỏ qua (xem ví dụ của tôi) –

9

Nếu bạn muốn kết hợp Unicode ký tự chứ không phải chỉ những người ASCII, hãy thử này:

#!/usr/bin/perl 

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

Nếu bạn đang tìm kiếm cho bất kỳ loại lá thư từ bất kỳ ngôn ngữ, bạn nên đi với

\p{L} 

Hãy xem toàn bộ tài liệu tham khảo này: Unicode Character Properties

0

Sử dụng /[A-Za-z]/ là cách làm trung tâm của Hoa Kỳ. Để chấp nhận bất kỳ lá thư, sử dụng một trong

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

Người thứ ba sử dụng một đôi tiêu cực: không không-một chữ, không phải là một con số, và không phải là dấu gạch dưới.

Cho dù bạn chọn, những người duy trì mã của bạn chắc chắn sẽ đánh giá cao nếu bạn gắn bó với một cách nhất quán!

0

Nếu bạn đang tìm cách phát hiện xem có gì đó giống như một số cho mục đích thao tác trong Perl, bạn sẽ muốn Scalar::Util :: looks_like_number (cốt lõi kể từ perl 5.7.3). Từ perlapi:

looks_like_number

Kiểm tra xem nội dung của một SV trông giống như một số (hoặc là một con số).Inf và Infinity được coi là số (do đó sẽ không phát hành cảnh báo số không), ngay cả khi atof() của bạn không bẻ khóa chúng.

Các vấn đề liên quan