使用RegEx验证Java中的名字和姓氏

使用RegEx验证Java中的名字和姓氏,java,regex,validation,match,names,Java,Regex,Validation,Match,Names,我正在尝试验证包含人名和姓氏的字符串。可接受的名称格式如下 Bruce Schneier Schneier, Bruce Schneier, Bruce Wayne O’Malley, John F. John O’Malley-Smith Cher 我想出了下面的程序来验证字符串变量。如果名称格式与提及的任何格式匹配,则validateName函数应返回true。否则它应该返回false import java.util.regex.*; public

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

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
。我做错了什么?

你可以:

^[^\s]+,?(\s[^\s]+)*$
使用以下命令:

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

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

  • 您在正则表达式中放置了太多反斜杠:
    “^[\\\\p{L}.-]+$”

    在Java文字解释之后,即:
    ^[\\p{L}.-]+$

    这意味着匹配以下字符的任意组合:

    \  p  {  L  }  space  .  '  -
    
    letters  space  .  '  -
    
    如果更改为:
    “^[\\p{L}.-]+$”

    正则表达式将看到:
    ^[\p{L}.-]+$

    这意味着匹配以下字符的任意组合:

    \  p  {  L  }  space  .  '  -
    
    letters  space  .  '  -
    

    但是:不验证名称

    看,这导致了


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

    约翰·冯·诺依曼会怎么样?埃迪·范·海伦怎么样<代码>汉斯·滕·布林克
    <代码>阿图罗·戴尔·安东尼奥?我在一家出版公司工作了七年,花了数百个小时研究这个问题。答:没有算法可以100%做到这一点,您需要构建并维护姓氏前缀列表。这是个难题。你的正则表达式的问题是四个反斜杠。。当您只需要2,但这并不能使您的正则表达式实际匹配所有测试时。
    -
    在字符类(
    []
    )中是有效的,无需进行scaped,只要它是第一个或最后一个,这是很好的。最大的问题实际上是有太多反斜杠。这是真的。我只是没有指出。我想他会看到我的代码的谢谢你分享你的想法。那个小片段只是课堂教学内容的一部分。但当我在处理现实世界的项目时,我肯定会记住你的建议。