我该如何检查Perl字符串中是否包含字母?

7
在Perl中,我应该使用什么正则表达式来查找一个字符字符串是否包含字母? 使用的字符串示例:Thu Jan 1 05:30:00 1970
这个正则表达式可以吗?
    if ($l =~ /[a-zA-Z]/)
 {
    print "string ";    
 }
 else
 {      
    print "number ";    
 }

什么是“字母表”?我建议给出您想匹配的字符串的示例。 - Aaron Digulla
4
亚伦:对于“字母”这个词的使用,大多数犯错的人都是印度背景的人。 - Joey
你想用字符串Thu Jan 1 05:30:00 1970做什么?我不是很明白。 - ghostdog74
我想检查它是否包含字母。 - fixxxer
如果您正在尝试解析日期,您应该考虑使用日期解析模块。http://datetime.perl.org/?Modules - daotoad
6个回答

15

试试这个:

/[a-zA-Z]/
或者
/[[:alpha:]]/
否则,你应该提供要匹配的字符串示例。
另外还应阅读perldoc perlrequick
编辑:@OP,你已经提供了示例字符串,但我不确定你想要做什么。所以我假设你想检查一个单词是全部字母、全部数字还是其他内容。以下是一些开始的内容,都来自于perldoc perlrequick(和perlretut),请阅读它们。
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";

输出

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

5
[a-zA-Z]在字母方面具有典型的美国视角。世界很大,POSIX字符类可能更好,但匹配Unicode字母属性是相同的,而且更容易键入。 :) - brian d foy
/[a-zA-Z]/ <-- 第二个 z 可能应该是大写的 (/[a-zA-Z]/),或者第一个 a-z 应该省略(见我的示例) - Dan Beam

9
如果你想匹配Unicode字符而不仅仅是ASCII字符,请尝试以下方法:
#!/usr/bin/perl

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

5
如果您需要任何语言的信函,建议选择:
\p{L}

请查看完整参考:Unicode字符属性


0
[^\W0-9_]

# or

[[:alpha:]]

请查看 perldoc perlre


0

使用/[A-Za-z]/是一种以美国为中心的方法。要接受任何字母,请使用以下之一:

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

第三个采用了双重否定:不是非字母,不是数字,也不是下划线。

无论您选择哪一个,维护您代码的人肯定会感激您坚持一致!


0
如果您想检测某个东西是否像一个数字,以便在Perl中操作它,您将需要使用Scalar::Util ::looks_like_number(自Perl 5.7.3以来的核心功能)。从perlapi

looks_like_number

测试SV的内容是否看起来像一个数字(或者是一个数字)。Inf和Infinity被视为数字(因此不会发出非数字警告),即使您的atof()无法理解它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接