我正在尝试验证用户名输入。应该有一个名字和所有字母(所有字母字符),每个字母以大写字母开头,两个名字之间有一个空格,完全没有别的。这是我的示例代码:
my $name = "John Smith";
if ( $name !~ /([A-Z]{1})([a-z]+)(\s)([A-Z]{1})([a-z]+){1}/g){
print "No Match!";
}else{
print "Match!";
}
问题是,这与“John Smith”或“John Smith Joe”匹配。我没有看到我的模式如何允许在第二个名称中的最后一组小写字母之后的任何内容,但它确实如此。我错过了什么?
谢谢!
答案 0 :(得分:3)
正则表达式可以简化为
^[A-Z][a-z]+\s[A-Z][a-z]+$
了解正则表达式在http://regex101.com/r/dX2hZ1/1
的匹配情况 ^
将正则表达式锚定在字符串的开头。也就是说,它确保字符串以[A-Z]
,大写
[A-Z][a-z]+
匹配大写后跟任意数量的小写
\s
匹配单个空格
[A-Z][a-z]+
匹配姓氏
$
将正则表达式锚定在字符串的末尾。确保没有任何内容跟随姓氏
你错了什么
正则表达式([A-Z]{1})([a-z]+)(\s)([A-Z]{1})([a-z]+){1}
按预期匹配名字和姓氏。但它没有考虑是否有任何事情。锚$
确保其不会出现任何其他内容。并且锚^
确保没有任何东西出现匹配字符串。