10

如何验证全名的正则表达式?我只想要字母(没有数字)和正则表达式的空格。这是我到目前为止所做的。你能帮我修复正则表达式吗?非常感谢你

public static boolean isFullname(String str) {
    boolean isValid = false;
    String expression = "^[a-zA-Z][ ]*$"; //I know this one is wrong for sure >,<
    CharSequence inputStr = str;
    Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(inputStr);
    if (matcher.matches()) {
        isValid = true;
    }
    return isValid;
}
4

6 回答 6

22

这个识别名字的问题非常以文化为中心,它确实没有可靠工作的希望。我真的不建议这样做,因为在我所知道的任何国家,地球上的任何地方,都没有规范的形式来构成一个人的名字我可以合法地将我的名字更改为#&*∫Ω∆ Smith,但这不适合任何人的算法。并不是说这个具体的例子是很多人都会做的事情,而是很多人在考虑数据输入时不会跳出 ASCII 表来思考,这会导致问题。

您可以反对这种情况发生的可能性,但在全球化的世界中,您的所有用户都不太可能使用英文音译的姓名拼写。您也很有可能拥有来自没有名字/姓氏概念的文化的用户。不要假设,即使您的应用程序仅在给定的国家/地区运行,您的一些用户也不会来自其他地方(人们总是从一个国家移动到另一个国家,其中一些人可能想要使用您的软件)。

保护您的应用免受此类字段的 SQL 注入(如果您将这些字段存储在数据库中),然后将其保留。

于 2011-09-09T14:25:28.863 回答
7

此方法验证名称并在名称没有任何内容或包含数字或特殊字符时返回 false:

public static boolean isFullname(String str) {
    String expression = "^[a-zA-Z\\s]+"; 
    return str.matches(expression);        
}
于 2014-02-10T07:45:07.487 回答
2

要求什么

而不是"^[a-zA-Z][ ]*$"你想要的"^[a-zA-Z ]*$"。有一些答案可以参考\s,但您不想要这些答案,因为它们会为您提供其他空白,例如制表符。

其他常见示例

附带说明一下,名字和姓氏都包含连字符,例如Mary-Ann名字或带连字符的姓氏,例如Jones-Garcia. 也有带有句点的姓氏,例如St. Marc. 最后,您有'一些姓氏,例如O'Donnel.

边注

从法律上讲,您可以将您的名字更改为Little Bobby Drop Tables ......或包含其他随机字符......但我不确定有多少系统真正适合这样的东西。

如果你想要一般情况(世界范围内),那么不要用任何字符类型来限制字段,因为你可以有希腊字母、西里尔字母、中文字母等的名称。还有非英语重音字符和其他东西就像德国的变音符号。

如果您担心 SQL 注入,请使用参数化查询而不是动态查询。

建议的解决方案

如果您只担心英文字母,并且想使用处理上述示例的正则表达式,那么您可以使用"^[a-zA-Z \-\.\']*$"

于 2016-01-28T16:41:38.637 回答
1

[A-Z]匹配单个大写字母(姓名的第一个字母)

[a-z]*匹配任意数量的小写字母(其他字母或名称)

(\s)匹配 1 个空白字符(名称之间的空格)

+一个或多个前面的表达式(匹配多个名称)

全部一起:

- matches first names / lastname -
^([A-Z][a-z]*((\s)))+[A-Z][a-z]*$

或匹配 DiMaggio St. Croix、O'Reilly 和 Le-Pew 等名称。您可以在记住它们时添加类似的字符,例如 MᶜKinley 中的“ᶜ”,或者遇到名字中有那些不太常见的字符的人

^([A-z\'\.-ᶜ]*(\s))+[A-z\'\.-ᶜ]*$

于 2011-09-09T13:53:03.273 回答
-2
public static boolean isFullname(String str) {
    return str.matches("^[a-zA-z ]*$");
}

如果字符串仅包含字母和空格,则此方法返回 true。

但如果字符串不包含任何内容,它也会返回 true。

于 2011-09-09T13:53:50.540 回答
-2

用于\s空格。您还可以String.matches(regex)用于测试字符串是否与正则表达式匹配。

public static boolean isFullname(String str) {
    String expression = "^[a-zA-Z\\s]*$"; 
    return str.matches(expression);        
}
于 2011-09-09T13:54:15.543 回答