使用 RegEx 验证 Java 中的名字和姓氏

Using RegEx for validating First and Last names in Java

我正在尝试验证包含一个人的名字和姓氏的 String。可接受的名称格式如下。

Bruce Schneier                  
Schneier, Bruce
Schneier, Bruce Wayne
O’Malley, John F.
John O’Malley-Smith
Cher

我想出了以下程序来验证 String 变量。 validateName 函数应该 return true 如果名称格式匹配任何提到的格式。否则它应该 return false.

import java.util.regex.*;

public class telephone {

    public static boolean validateName (String txt){
        String regx = "^[\\p{L} .'-]+$";
        Pattern pattern = Pattern.compile(regx, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(txt);
        return matcher.find();

    }

    public static void main(String args[]) {

        String name = "Ron O’’Henry";

        System.out.println(validateName(name));

    }
}

但由于某种原因,它是 returning false 任何值。我在这里做错了什么?

你可以这样做:

^[^\s]+,?(\s[^\s]+)*$

使用这个:

^[\p{L}\s.’\-,]+$

演示: https://regex101.com/r/dQ8fK8/1

解释:

  1. 您遇到的最大问题是',而是不同的。您只能通过从文本中复制粘贴来实现该字符。
  2. []中使用\-代替-,因为它会被误认为是一个范围。例如:[a-z]
  3. 您可以使用 \s 而不是 来匹配任何空格。

您在正则表达式中使用了太多反斜杠:"^[\\p{L} .'-]+$"
经过Java字面解释,即:^[\p{L} .'-]+$
这意味着匹配以下字符的任意组合:

\  p  {  L  }  space  .  '  -

如果改为:"^[\p{L} .'-]+$"
正则表达式将看到:^[\p{L} .'-]+$
这意味着匹配以下字符的任意组合:

letters  space  .  '  -

但是:不验证名称

参见What are all of the allowable characters for people's names?, which leads to Personal names around the world

简而言之:你不能,所以不要