西里尔字母验证

13

今天我遇到了一个有趣的缺陷。问题是,我在俄罗斯部署了我的Web应用程序,并且在下面的方法中名称值“Наталья”没有作为字母数字返回true。很好奇如何解决这样的问题!-Duncan

private boolean isAlphaNumeric(String str) {
    return str.matches("[\\w-']+");
}

没错!我该如何接受我不理解的有效答案?请帮帮我! - Duncan Krebs
@Eugene,您是在指我提供的答案吗? - Op De Cirkel
1
没关系,我已经弄明白了,我可以通过点击复选框来接受答案。我已经接受了你的答案,谢谢你提供的信息。 - Duncan Krebs
2个回答

18

您必须使用Unicode正则表达式。例如,\p{L}+匹配任何Unicode字母。要了解更多,请查看Java文档中名为unicode support的部分,此处有关于Unicode支持的详细信息:链接


14

在我的情况下,我必须检查是否是用俄语书写的姓名。

我最终得到了这个:

private static final String ruNameRegEx = "[А-ЯЁ][-А-яЁё]+";

并且对于全名:

private static final String ruNamePart = "[А-яЁё][-А-яЁё]+";
private static final String ruFullNameRegEx = "\\s*[А-ЯЁ][-А-яЁё]+\\s+(" + ruNamePart + "\\s+){1,5}" + ruNamePart + "\\s*";)";

最后一个覆盖了一些复杂的情况:

public class Test {
    Pattern ruFullNamePattern = Pattern.compile(ruFullNameRegEx);

    @Test
    public void test1() {
        assertTrue(isRuFullName("Иванов Василий Иванович"));
    }

    @Test
    public void test2() {
        assertTrue(isRuFullName(" Иванов Василий Акимович "));
    }

    @Test
    public void test3() {
        assertTrue(isRuFullName("Ёлкин Василий Иванович"));
    }

    @Test
    public void test4() {
        assertTrue(isRuFullName("Иванов Василий Аксёнович"));
    }

    @Test
    public void test5() {
        assertFalse(isRuFullName("иванов василий акимович"));
    }

    @Test
    public void test6() {
        assertFalse(isRuFullName("Иванов С.В."));
    }

    @Test
    public void test7() {
        assertTrue(isRuFullName("Мамин-Сибиряк Анна-Мария Иоановна"));
    }

    @Test
    public void test8() {
        assertTrue(isRuFullName("Хаджа Насредин Махмуд-Азгы-Бек"));
    }

    @Test
    public void test9() {
        assertTrue(isRuFullName("Хаджа Насредин ибн Махмуд"));
    }

    private boolean isRuFullName(String testString) {
        Matcher m = ruFullNamePattern.matcher(testString);
        return m.matches();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接