使用RegEx验证Java中的名字和姓氏
我正在尝试验证包含人名和姓氏的使用RegEx验证Java中的名字和姓氏,java,regex,validation,match,names,Java,Regex,Validation,Match,Names,我正在尝试验证包含人名和姓氏的字符串。可接受的名称格式如下 Bruce Schneier Schneier, Bruce Schneier, Bruce Wayne O’Malley, John F. John O’Malley-Smith Cher 我想出了下面的程序来验证字符串变量。如果名称格式与提及的任何格式匹配,则validateName函数应返回true。否则它应该返回false import java.util.regex.*; public
字符串。可接受的名称格式如下
Bruce Schneier
Schneier, Bruce
Schneier, Bruce Wayne
O’Malley, John F.
John O’Malley-Smith
Cher
我想出了下面的程序来验证字符串变量。如果名称格式与提及的任何格式匹配,则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
。我做错了什么?你可以:
^[^\s]+,?(\s[^\s]+)*$
使用以下命令:
^[\p{L}\s.’\-,]+$
演示:
说明:
您遇到的最大问题是,
,,
是不同的。只能通过从文本中复制粘贴来实现该字符
使用\-
而不是[]
中的-
,因为它会被误认为是一个范围。例如:[a-z]
您可以使用\s
而不是
来匹配任何空白
您在正则表达式中放置了太多反斜杠:“^[\\\\p{L}.-]+$”
在Java文字解释之后,即:^[\\p{L}.-]+$
这意味着匹配以下字符的任意组合:
\ p { L } space . ' -
letters space . ' -
如果更改为:“^[\\p{L}.-]+$”
正则表达式将看到:^[\p{L}.-]+$
这意味着匹配以下字符的任意组合:
\ p { L } space . ' -
letters space . ' -
但是:不验证名称
看,这导致了
简言之:你不能,所以不要。约翰·冯·诺依曼会怎么样?埃迪·范·海伦怎么样<代码>汉斯·滕·布林克
<代码>阿图罗·戴尔·安东尼奥?我在一家出版公司工作了七年,花了数百个小时研究这个问题。答:没有算法可以100%做到这一点,您需要构建并维护姓氏前缀列表。这是个难题。你的正则表达式的问题是四个反斜杠。。当您只需要2,但这并不能使您的正则表达式实际匹配所有测试时。-
在字符类([]
)中是有效的,无需进行scaped,只要它是第一个或最后一个,这是很好的。最大的问题实际上是有太多反斜杠。这是真的。我只是没有指出。我想他会看到我的代码的谢谢你分享你的想法。那个小片段只是课堂教学内容的一部分。但当我在处理现实世界的项目时,我肯定会记住你的建议。