当前位置: 首页 > 知识库问答 >
问题:

如果字符串包含连字符,则使用regex验证第二个名称

何德寿
2023-03-14
/**
     *   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;
    }

你能告诉我如何改变我的regex字符串模式来验证带有连字符的第二个名称吗?

共有1个答案

柳昊焱
2023-03-14

您可以使用

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}+)*regex匹配

  • \p{Lu}-大写Unicode字母
  • \p{Ll}+-1+小写Unicode字母
  • (?:-\p{Lu}\p{Ll}+)*-零次或多次重复
    • --连字符
    • \p{Lu}-大写Unicode字母
    • \p{Ll}+-1+小写Unicode字母
    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
    

 类似资料:
  • 我想使用正则表达式来验证名称。名称必须包含名、中间名、姓氏(不一定全部)。但我还想设置一个条件,即名称必须至少包含四个字符。我在这里找到了用于验证全名的正则表达式Java regex to validate full name…,并在这里找到用于检查字符串中是否至少有三个字符(字母)的正则表达式regex,以检查是否至少有3个字符。但我不确定如何将这两者结合起来以获得期望的结果。请帮助我实现所需的

  • 我将正则表达式模式的列表传递给以对照syslog文件进行检查。它们通常匹配IP地址和日志条目; 它只是一个模式列表,例如我正在循环中传递的部分,因此我不能传递“-v”。 更新:这发生在像这样的脚本中;

  • 问题内容: 我有以下代码。 如您在上面看到的,如果字符串不包含顶点,名称或透明度,我希望将其打印出来。但是我得到一个编译错误,说|| 参数类型未定义operator。我是编程的新手,所以我不确定这意味着什么,请问有人可以指出正确的方向来修复我的代码吗? 问题答案: || 运算符使用单个布尔项,而不是提供许多不同的参数。

  • 题目描述 给定两个分别由字母组成的字符串A和字符串B,字符串B的长度比字符串A短。请问,如何最快地判断字符串B中所有字母是否都在字符串A里? 为了简单起见,我们规定输入的字符串只包含大写英文字母,请实现函数bool StringContains(string &A, string &B) 比如,如果是下面两个字符串: String 1:ABCD String 2:BAD 答案是true,即Stri

  • 问题内容: 我正在尝试验证我的字符串是否与模式匹配。也就是说,完整的字符串可以写为该模式。但是,如果有任何子字符串匹配该模式,则返回。(如回报,这是我不想在这个例子中,我宁愿验证,整个字符串只含有少量拉丁字母)。 问题答案: 您可以使用 开始 和 结束 标记,并分别指示开始,在您的正则表达式模式的字符串的结尾。这样,您可以使表达式仅匹配整个字符串,而不匹配任何子字符串。在您的情况下,它将如下所示:

  • 问题内容: 我有以下Angular代码: 如何使用ng-if条件查找特定字符: 只在字符在这里时显示代码?我的值是88?77,数字是动态的,但问号始终存在,我似乎无法基于此进行过滤? 问题答案: ES2015更新 ES2015具有检查字符串是否包含另一个字符串的方法。如果目标环境支持,则可以使用它。如果在 干草堆中 找到了 针, 则该方法返回,否则返回。 __ 在这里是要搜索的字符串。 请参阅MD