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, становится ясным (а если нет, рефакторировать до тех пор, пока оно не будет)

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