Regex для проверки алфавитов и чисел в локализованной строке
У меня есть поле ввода, которое локализовано. Мне нужно добавить валидацию с помощью регулярного выражения, которое должно принимать только алфавиты и числа. Я мог бы использовать [a-z0-9]
, если бы использовал только английский.
В настоящее время я использую метод Character.isLetterOrDigit(name.charAt(i))
(да, я повторяю через каждый символ), чтобы отфильтровать алфавиты, присутствующие на разных языках.
Есть ли лучшие способы сделать это? Для этого доступны любые регулярные выражения или другие библиотеки?
Ответы
Ответ 1
Начиная с Java 7 вы можете использовать Pattern.UNICODE_CHARACTER_CLASS
String s = "Müller";
Pattern p = Pattern.compile("^\\w+$", Pattern.UNICODE_CHARACTER_CLASS);
Matcher m = p.matcher(s);
if (m.find()) {
System.out.println(m.group());
} else {
System.out.println("not found");
}
без опции он не распознает слово "Müller", но используя Pattern.UNICODE_CHARACTER_CLASS
Включает Unicode версию предопределенных классов символов и классов символов POSIX.
Подробнее см.
Вы также можете посмотреть здесь для получения дополнительной информации о Unicode в Java 7.
и здесь на regular-expression.info обзор сценариев, свойств и блоков Unicode.
См. здесь известный ответ tchrist о предостережениях регулярного выражения на Java, включая обновленное то, что изменилось с помощью Java 7 (из этого будет в Java 8)
Ответ 2
boolean foundMatch = name.matches("[\\p{L}\\p{Nd}]*");
должен работать.
[\p{L}\p{Nd}]
соответствует символу, который является буквой или цифрой Unicode. Метод regex .matches()
гарантирует, что вся строка соответствует шаблону.
Ответ 3
Некоторые люди, столкнувшись с проблемой, думают: "Я знаю, я буду использовать регулярные выражения". Теперь у них есть две проблемы.
- Джейми Завинки
Я говорю это в шутку, но повторение через String, как вы делаете, будет иметь производительность во время выполнения, по крайней мере, так же хорошо, как любое регулярное выражение, - нет никакого способа, чтобы регулярное выражение могло делать то, что вы хотите быстрее; и у вас нет накладных расходов на компиляцию шаблона в первую очередь.
До тех пор, пока:
- для проверки не нужно делать что-либо другое, подобное регулярному выражению (в вопросе ничего не упоминалось)
- намерение цикла, проходящего через String, становится ясным (а если нет, рефакторировать до тех пор, пока оно не будет)
то зачем заменять его регулярным выражением только потому, что вы можете?