正则表达式完全匹配 - 名字和姓氏之间有一个空格

Don*_*onC 5 regex perl

我正在尝试验证用户名输入。应该有一个名字和姓氏(所有字母字符),每个都以大写字母开头,两个名字之间有一个空格,没有其他任何东西。这是我的示例代码:

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!";
}
Run Code Online (Sandbox Code Playgroud)

问题是,这与“John Smith”或“John Smith Joe”匹配。我没有看到我的模式如何允许在第二个名称中的最后一组小写字母之后的任何内容,但它确实如此。我错过了什么?

谢谢!

nu1*_*73R 3

正则表达式可以简化为

^[A-Z][a-z]+\s[A-Z][a-z]+$
Run Code Online (Sandbox Code Playgroud)

查看正则表达式如何匹配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}按预期匹配名字和姓氏。但它不考虑接下来是否会发生任何事情。锚点$确保它后面没有任何其他东西。并且锚点^确保匹配字符串之前没有任何内容。

  • 我无意破坏聚会,但请注意有些名字不符合您的模式,例如“Paul McCartney”或一些苏格兰名字。另外,在允许国际用户时,您可能必须注意 utf8。 (3认同)