Регулярное выражение для проверки алфавитов и чисел в локализованной строке

У меня есть поле ввода, которое локализовано. Мне нужно добавить проверку с помощью регулярного выражения, что она должна принимать только буквы и цифры. Я мог бы использовать [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, как вы делаете, будет иметь производительность во время выполнения, по крайней мере, такую ​​же, как у любого регулярного выражения - нет никакого способа, которым регулярное выражение может делать то, что вы хотите быстрее; и у вас нет накладных расходов на компиляцию шаблона в первую очередь.

Так что пока:

  • проверка не должна делать ничего похожего на регулярные выражения (в вопросе ничего не упоминалось)
  • намерение зацикливания кода через строку ясно (и если нет, рефакторинг, пока он не будет)

тогда зачем заменять его регулярным выражением только потому, что вы можете?

Другие вопросы по тегам