【问题标题】:Regex Exact Match - First and Last Name with One Space Between正则表达式完全匹配 - 名字和姓氏之间有一个空格
【发布时间】:2014-11-08 19:57:51
【问题描述】:

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

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”匹配。我看不出我的模式如何允许第二个名称中最后一组小写字母之后的任何内容,但确实如此。我错过了什么?

谢谢!

【问题讨论】:

  • 这出现在编辑队列中,所以我会在几年后停下来告诫人们不要接受这个任务。在现实世界中,您会发现许多名称不适合此任务,并且没有简单的解决方案。请参阅kalzumeus.com/2010/06/17/…design-system.service.gov.uk/patterns/names 以及其他各种内容。最值得注意的是,这里没有解决方案可以处理两个名字或任何连字符的名称。

标签: regex perl


【解决方案1】:

正则表达式可以简化为

^[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} 与预期的名字和姓氏匹配。但它不考虑是否有任何后续。锚$ 确保它后面没有其他任何东西。并且锚点^ 确保匹配字符串之前没有任何内容。

【讨论】:

  • 你应该解释为什么他的方法不起作用以及你添加 ^$ 是如何解决它的。但很好的答案
  • @sshashank124 只是在答案中添加细节。谢谢你的指导:)
  • 我并不是要破坏派对,但请注意有些名字不符合您的模式,例如“Paul McCartney”或一些苏格兰名字。此外,在允许国际用户时,您可能需要注意 utf8。
  • @nu11p01n73R 感谢您的解释和帮助!
【解决方案2】:

这在您的情况下非常有效。

pattern = "^[A-Z]{1}[a-z]+[ ]{1}[A-Z]{1}[a-z]+$"

【讨论】:

    【解决方案3】:

    我稍微修改了 nu11p01n73R 的回答:/^[A-Z][a-z]{2,}\s[A-Z][a-z]{2,}$/ 将确保名字和姓氏的最小长度为 3 个字符(也不允许数字)。 如果你想允许 Owen McCartney 和 Owen George 这样的名字,你可以使用上面的重新格式化为/^[A-Z][a-z]{2,}\s[A-Z][a-zA-Z]{2,}$/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 1970-01-01
      • 2016-01-01
      相关资源
      最近更新 更多