我正在尝试验证包含第一个&的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
。我在这里做错了什么?
答案 0 :(得分:3)
你可以这样做:
^[^\s]+,?(\s[^\s]+)*$
答案 1 :(得分:3)
使用此:
^[\p{L}\s.’\-,]+$
演示: https://regex101.com/r/dQ8fK8/1
'
和’
不同。您只能通过从文本中复制粘贴来实现该角色。\-
中使用-
代替[]
,因为它会被误认为是一个范围。例如:[a-z]
\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。
简而言之:你不能,所以不要。