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

时间:2016-04-25 03:28:06

标签: java regex validation match names

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

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

我想出了以下程序来验证String变量。如果名称格式与任何提到的格式匹配,则validateName函数应返回true。否则它应该返回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));

    }
}

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

3 个答案:

答案 0 :(得分:3)

你可以这样做:

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

答案 1 :(得分:3)

使用此:

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

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

说明:

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

答案 2 :(得分:1)

你在正则表达式中添加了太多的反斜杠:"^[\\\\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?,这会导致Personal names around the world

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