Регулярное выражение для проверки алфавитов и чисел в локализованной строке
У меня есть поле ввода, которое локализовано. Мне нужно добавить проверку с помощью регулярного выражения, что она должна принимать только буквы и цифры. Я мог бы использовать [a-z0-9]
если бы я использовал только английский.
На данный момент я использую метод Character.isLetterOrDigit(name.charAt(i))
(да, я перебираю каждый символ), чтобы отфильтровать алфавиты, присутствующие на разных языках.
Есть ли лучшие способы сделать это? Любые регулярные выражения или другие библиотеки, доступные для этого?
3 ответа
Начиная с 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");
}
без этой опции он не распознает слово "Мюллер", но использует Pattern.UNICODE_CHARACTER_CLASS
Включает Unicode-версию предопределенных классов символов и классов символов POSIX.
Смотрите здесь для более подробной информации
Вы также можете посмотреть дополнительную информацию по Unicode в Java 7.
и здесь, на регулярном выражении, обзор скриптов, свойств и блоков Unicode.
Посмотрите здесь известный ответ от tchrist о предостережениях регулярных выражений в Java, включая обновленное то, что изменилось с Java 7 (из будет в Java 8)
boolean foundMatch = name.matches("[\\p{L}\\p{Nd}]*");
должно сработать.
[\p{L}\p{Nd}]
соответствует символу, который является либо буквой Unicode, либо цифрой. Регулярное выражение .matches()
Метод гарантирует, что вся строка соответствует шаблону.
Некоторые люди, сталкиваясь с проблемой, думают: "Я знаю, я буду использовать регулярные выражения". Теперь у них две проблемы.
Я говорю это в шутку, но итерация по String, как вы делаете, будет иметь производительность во время выполнения, по крайней мере, такую же, как у любого регулярного выражения - нет никакого способа, которым регулярное выражение может делать то, что вы хотите быстрее; и у вас нет накладных расходов на компиляцию шаблона в первую очередь.
Так что пока:
- проверка не должна делать ничего похожего на регулярные выражения (в вопросе ничего не упоминалось)
- намерение зацикливания кода через строку ясно (и если нет, рефакторинг, пока он не будет)
тогда зачем заменять его регулярным выражением только потому, что вы можете?