Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果字符串包含连字符,则使用正则表达式验证第二个名称_Java_Regex - Fatal编程技术网

Java 如果字符串包含连字符,则使用正则表达式验证第二个名称

Java 如果字符串包含连字符,则使用正则表达式验证第二个名称,java,regex,Java,Regex,我在Java中使用正则表达式验证第二个名称时遇到问题 我使用方法将给定的正则表达式编译成模式。方法创建匹配器,该匹配器将根据此模式匹配给定输入 如果字符串包含连字符,我需要验证第二个名称 这是我要验证的功能: /** * Determines if the string is valid and returns result code * * @param fio string to validate * @r

我在Java中使用正则表达式验证第二个名称时遇到问题

我使用方法将给定的正则表达式编译成模式。方法创建匹配器,该匹配器将根据此模式匹配给定输入

如果字符串包含连字符,我需要验证第二个名称

这是我要验证的功能:

/**
     *   Determines if the string is valid and returns result code
     *
     *   @param fio                  string to validate
     *   @return                     1 - valid second name, name, patronymic; 2 - valid second name, name; 0 - invalid string
     */
    public static int Validate(String fio) {
        Pattern pattern;
        Matcher matcher;
        try {
            pattern = Pattern.compile("([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+"); //second name; name; patronymic
            matcher = pattern.matcher(fio);
            if (matcher.matches()) return 1;

            pattern = Pattern.compile("([A-Z])[a-z]+ ([A-Z])[a-z]+"); //second name; name
            matcher = pattern.matcher(fio);
            if (matcher.matches()) return 2;

        } catch (PatternSyntaxException ex1) {
            System.out.println("String is incorrect!");
        }
        return 0;
    }
您能告诉我如何更改我的正则表达式字符串模式以使用连字符验证第二个名称吗?

您可以使用

公共静态int验证(字符串fio){
//第二个名字;名字;赞助人
if(fio.matches(“\\p{Lu}\\p{Ll}+(?:-\\p{Lu}\\p{Ll}+)*\\p{Lu}\\p{Ll}+\\p{Lu}\\p{Ll}+”){
返回1;
}
//第二个名字
if(fio.matches(“\\p{Lu}\\p{Ll}+(?:-\\p{Lu}\\p{Ll}+)*\\p{Lu}\\p{Ll}+”){
返回2;
}
返回0;
}
\p{Lu}\p{Ll}+(?:-\p{Lu}\p{Ll}+)*
正则表达式匹配

  • \p{Lu}
    -大写Unicode字母
  • \p{Ll}+
    -1+小写Unicode字母
  • (?:-\p{Lu}\p{Ll}+)*
    -零次或多次重复
    • -
      -连字符
    • \p{Lu}
      -大写Unicode字母
    • \p{Ll}+
      -1+小写Unicode字母
见a:

System.out.println(验证(验证);
// => 1
系统输出打印(验证(“Сжжжжааа”);
// => 2
系统输出打印(验证(“Сжжжжжжа-БаааАааааааг”);
// => 1
系统输出打印(验证(“Сжжжжбббб-Бббббббббб;
// => 2
系统输出打印(验证(“Сжжжжжж”);
// => 0

fio
是指
Фаааааааааааааааа你不想让
\p{L}
匹配Unicode字母吗?当然我用这样的缩写:)你想做什么有点不清楚。在其中一个名称中匹配可选的
-
?像
\p{L}+(?:-\p{L}+)
?我是regex新手。我认为是这样。我只需要确定第二个名称字符串是否包含使用正则表达式的连字符。非常感谢,但我的正则表达式字符串有什么问题?是否可以添加连字符检查?@WideWood我添加了它
(?:-[A-Z][A-Z]+)*
是我上述建议的ASCII等价物。