【问题标题】:Using RegEx for validating First and Last names in Java使用 RegEx 验证 Java 中的名字和姓氏
【发布时间】:2016-08-18 07:30:25
【问题描述】:

我正在尝试验证包含一个人的名字和姓氏的String。可接受的名称格式如下。

Bruce Schneier                  
Schneier, Bruce
Schneier, Bruce Wayne
O’Malley, John F.
John O’Malley-Smith
Cher

我想出了以下将验证字符串变量的程序。 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。我在这里做错了什么?

【问题讨论】:

  • John Von Neumann 会发生什么? Eddie Van Halen 怎么样? Hans Ten Brink? Arturo Dell'Antonio?我在一家出版公司工作了七年,花了数百个小时来解决这个问题。答:没有算法可以100%做到这一点,您需要构建和维护一个姓氏前缀列表。这是一个困难的问题。
  • 您的正则表达式的问题是四个反斜杠。当您只需要 2 个时,但这并不能使您的正则表达式真正匹配所有测试。

标签: java regex validation match names


【解决方案1】:

使用这个:

^[\p{L}\s.’\-,]+$

演示: https://regex101.com/r/dQ8fK8/1

解释:

  1. 您遇到的最大问题是' 不同。您只能通过从文本中复制粘贴来实现该字符。
  2. [] 中使用\- 而不是-,因为它会被误认为是一个范围。例如:[a-z]
  3. 您可以使用\s 而不是 来匹配任何空格。

【讨论】:

  • - 在字符类 ([]) 中是有效的非转义字符,只要它是 firstlast,它是,所以很好。
  • 最大的问题实际上是反斜杠太多。
  • 嗯,没错。我只是没有指出。我想他会通过看到我的代码得到它
【解决方案2】:

你可以这样做:

^[^\s]+,?(\s[^\s]+)*$

【讨论】:

    【解决方案3】:

    您在正则表达式中放置了太多反斜杠:"^[\\\\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

    简而言之:你不能,所以不要

    【讨论】:

    • 感谢您分享您的想法。那个小sn-p只是课堂内容的一部分。但是,当我处理现实世界的项目时,我一定会牢记您的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2013-11-04
    • 2016-02-22
    相关资源
    最近更新 更多