如何匹配两个以大写字母开头的连续单词?

时间:2013-11-14 09:49:54

标签: perl

我想匹配名字和姓氏。

e.g。 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*$/

2 个答案:

答案 0 :(得分: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到无限次[贪心]空白[\ t \ r \ n \ f \ v]
  • Char class [A-Z]匹配:A-Z Literal A和Literal Z之间的字符范围
  • \w+ 1到无限次[贪心]字符[a-zA-Z_ \ d]
  • \s+ 1到无限次[贪心]空白[\ t \ r \ n \ f \ v]
  • Char class [A-Z]匹配:A-Z Literal A和Literal Z之间的字符范围
  • \w+ 1到无限次[贪心]字符[a-zA-Z_ \ d]
  • \s* 0到无限次[贪心]空白[\ t \ r \ n \ f \ v]
  • $行尾

答案 1 :(得分:0)

/^ \s* \p{Lu}\S+ \s+ \p{Lu}\S+ \s* \z/x