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规范的形式来构成一个人的名字。我可以合法地将我的名字更改为#&*∫Ω∆ Smith
,但这不适合任何人的算法。并不是说这个具体的例子很多人都会做,而是很多人在考虑数据输入的时候并没有跳出ASCII表来思考,这会导致问题。
您可以反对这种情况发生的可能性,但在全球化的世界中,您的所有用户的名字都不太可能使用英语音译。您也很有可能拥有来自没有名字/姓氏概念的文化的用户。不要假设,即使您的应用程序仅在给定的国家/地区运行,您的一些用户也不会来自其他地方(人们总是从一个国家移动到另一个国家,其中一些人可能想要使用您的软件)。
保护您的应用免受此类字段的 SQL 注入(如果您将这些字段存储在数据库中),然后将其保留。
【讨论】:
... I could legally change my name to #&*∫Ω∆ 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 - 全名的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章