Java - 全名的正则表达式

Posted

技术标签:

【中文标题】Java - 全名的正则表达式【英文标题】:Java - Regex for Full Name 【发布时间】:2011-11-13 19:45:00 【问题描述】:

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

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;

【问题讨论】:

不要对人名做出任何假设。时期。当你应该使用[\pL\pM\pNl] 时,不要使用[a-z]。不要忘记标点符号。 那些名字像斯嘉丽奥哈拉或巴沙尔阿萨德的人怎么样? 引用tchrist,“认为某人的名字只能包含某些字符的代码是愚蠢、冒犯和错误的。” 非常感谢您。我现在意识到我不应该验证全名的正则表达式。但我仍然不得不认为,即使符号也可以通过验证 "%^@^#!@*" ***.com/questions/2385701/… 【参考方案1】:

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

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

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

【讨论】:

... I could legally change my name to #&amp;*∫Ω∆ Smith, and that's not going to fit into anyone's algorithm... ^.*$ 怎么样 :)【参考方案2】:

此方法验证名称,如果名称没有任何内容或包含数字或特殊字符,则返回 false:

public static boolean isFullname(String str) 
    String expression = "^[a-zA-Z\\s]+"; 
    return str.matches(expression);        

【讨论】:

【参考方案3】:

要求什么

你想要"^[a-zA-Z ]*$" 而不是"^[a-zA-Z][ ]*$"。有一些答案引用了\s,但你不想要这些,因为它们会给你其他空白,比如标签。

其他常见示例

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

旁注

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

如果您想要一般情况(全球范围内),则不要以任何字符类型限制字段,因为您可以使用希腊字母、西里尔字母、中文字母等命名。还有非英语重音字符以及其他诸如德语变音符号之类的东西。

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

建议的解决方案

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

【讨论】:

【参考方案4】:

[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\'\.-ᶜ]*$

【讨论】:

Joe DiMaggio 可能对此有话要说 :-) @NullUser,支持中间名。 @pax,DiMaggio 先生可能有问题。我会修改 在“John Paul Jones”上失败。 “蕾妮弗莱明”失败。 “Dominque Strauss-Kahn”失败。 “亨利国王 Ⅷ”失败。 “蒂姆·奥莱利”失败。 “Secretary Federico Peña”失败。在“汽车旅馆 6”上失败。 “雪儿”失败。 “Antonio Cipriano José María y Francisco de Santa Ana Machado y Ruiz”失败。失败失败失败失败失败失败失败失败。 误报“___^^^_^\\\\[[[]][][____”。【参考方案5】:
public static boolean isFullname(String str) 
    return str.matches("^[a-zA-z ]*$");

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

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

【讨论】:

【参考方案6】:

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

public static boolean isFullname(String str) 
    String expression = "^[a-zA-Z\\s]*$"; 
    return str.matches(expression);        

【讨论】:

空字符串误报。 “Dominque Strauss-Kahn”的假阴性。 @tchrist 为什么你认为每个人都有名字? ^$ 无需与.matches() 一起使用 误报“\n\f\f\t”。

以上是关于Java - 全名的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式全名验证

用于验证大写字母全名的正则表达式(包括 unicode 字符)?

正则表达式选项分析

java正则表达式的使用

java正则表达式

java 正则表达式