今天我遇到了一个有趣的缺陷。问题是,我在俄罗斯部署了我的Web应用程序,并且在下面的方法中名称值“Наталья”没有作为字母数字返回true。很好奇如何解决这样的问题!-Duncan
private boolean isAlphaNumeric(String str) {
return str.matches("[\\w-']+");
}
今天我遇到了一个有趣的缺陷。问题是,我在俄罗斯部署了我的Web应用程序,并且在下面的方法中名称值“Наталья”没有作为字母数字返回true。很好奇如何解决这样的问题!-Duncan
private boolean isAlphaNumeric(String str) {
return str.matches("[\\w-']+");
}
您必须使用Unicode正则表达式。例如,\p{L}+
匹配任何Unicode字母。要了解更多,请查看Java文档中名为unicode support的部分,此处有关于Unicode支持的详细信息:链接。
在我的情况下,我必须检查是否是用俄语书写的姓名。
我最终得到了这个:
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();
}
}