【问题标题】:Java - Regex for Full NameJava - 全名的正则表达式
【发布时间】: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\p{Nl}] 时,不要使用[a-z]。不要忘记标点符号。
  • 那些名字像斯嘉丽奥哈拉或巴沙尔阿萨德的人怎么样?
  • 引用tchrist,“认为某人的名字只能包含某些字符的代码是愚蠢、冒犯和错误的。”
  • 非常感谢您。我现在意识到我不应该验证全名的正则表达式。但我仍然不得不认为,即使符号也可以通过验证 "%^@^#!@*"

标签: java regex string validation matcher


【解决方案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”。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-10
        • 1970-01-01
        • 1970-01-01
        • 2015-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多