首页 > 解决方案 > 如果字符串包含连字符,则使用正则表达式验证第二个名称

问题描述

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

我使用Pattern.compile方法将给定的正则表达式编译成模式。和Pattern.mathcer方法来创建一个匹配器,它将给定的输入与这个模式相匹配。

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

这是我要验证的功能:

/**
     *   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;
    }

您能告诉我如何更改我的正则表达式字符串模式以使用连字符验证第二个名称吗?

标签: javaregex

解决方案


您可以使用

public static int Validate(String fio) {
    //second name; name; patronymic
    if (fio.matches("\\p{Lu}\\p{Ll}+(?:-\\p{Lu}\\p{Ll}+)* \\p{Lu}\\p{Ll}+ \\p{Lu}\\p{Ll}+")) {
        return 1;
    }
    //second name; name
    if (fio.matches("\\p{Lu}\\p{Ll}+(?:-\\p{Lu}\\p{Ll}+)* \\p{Lu}\\p{Ll}+")) {
        return 2;
    }
    return 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 字母

在线查看Java 演示

System.out.println(Validate("Стриженов Анатолий Иванович"));
// => 1
System.out.println(Validate("Стриженов Анатолий"));
// => 2
System.out.println(Validate("Стриженов-Бродский Анатолий Иванович"));
// => 1
System.out.println(Validate("Стриженов-Бродский Анатолий"));
// => 2
System.out.println(Validate("Стриженов"));
// => 0

推荐阅读