1

我想匹配名字和姓氏。

例如 Robert Still,单词的前后可以有空格,但是字符串只能包含两个单词。

' Robert Still    ' = true
' Robert     Still ' = true
'e  Robert Still  4 ' = false 

这是我尝试过的代码

m/^\s*[A-Z].*[a-z]\s*[A-Z].*[a-z]\s*$/
4

2 回答 2

4

尝试这个:

#!/usr/bin/perl -w
use strict; 

my @names = ('Robert Still', '    Robert Still', 'Robert Still    ', '4 Robert Still 2', 'Robert e Still');

foreach (@names){
    if ($_ =~ /(^\s*[A-Z]\w+\s+[A-Z]\w+\s*$)/){
        print "'$_' : true\n" 
    }
    else {
        print "'$_' : false\n";
    }
}

输出:

'Robert Still' : true
'    Robert Still' : true
'Robert Still    ' : true
'4 Robert Still 2' : false
'Robert e Still' : false

正则表达式解释:

  • ^线的开始
  • \s*0 到无限次 [greedy] 空白 [\t \r\n\f\v]
  • 字符类[A-Z]匹配: AZ 文字 A 和文字 Z 之间的字符范围
  • \w+1 到无限次 [greedy] 字字符 [a-zA-Z_\d]
  • \s+1 到无限次 [greedy] 空白 [\t \r\n\f\v]
  • 字符类[A-Z]匹配: AZ 文字 A 和文字 Z 之间的字符范围
  • \w+1 到无限次 [greedy] 字字符 [a-zA-Z_\d]
  • \s*0 到无限次 [greedy] 空白 [\t \r\n\f\v]
  • $行结束
于 2013-11-14T10:08:51.947 回答
0
/^ \s* \p{Lu}\S+ \s+ \p{Lu}\S+ \s* \z/x
于 2013-11-14T12:08:28.250 回答