Регулярное выражение для проверки алфавитов и чисел в локализованной строке - PullRequest
11 голосов
/ 29 февраля 2012

У меня есть поле ввода, которое локализовано .Мне нужно добавить проверку с помощью регулярного выражения, что она должна принимать только буквы и цифры.Я мог бы использовать [a-z0-9], если бы использовал только английский.

На данный момент я использую метод Character.isLetterOrDigit(name.charAt(i)) (да, я перебираю каждый символ) для фильтрации алфавитов, присутствующих в различных алфавитах.языки.

Есть ли лучшие способы сделать это?Для этого есть какие-либо регулярные выражения или другие библиотеки?

Ответы [ 3 ]

21 голосов
/ 29 февраля 2012

Начиная с 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

Включает версию предопределенных классов символов и классов символов POSIX в Unicode.

Подробнее см.

Вы также можете посмотреть здесь для получения дополнительной информации Unicode в Java 7.

и здесь на регулярное выражение.info обзор сценариев, свойств и блоков Юникода.

Смотрите здесь известный ответ от tchrist о предостережениях регулярных выражений в Java, включая обновленное то, что изменилось с Java 7 (из будет в Java 8)

8 голосов
/ 29 февраля 2012
boolean foundMatch = name.matches("[\\p{L}\\p{Nd}]*");

должно работать.

[\p{L}\p{Nd}] соответствует символу, который является либо буквой Unicode, либо цифрой. Метод regex .matches() гарантирует, что вся строка соответствует шаблону.

1 голос
/ 29 февраля 2012

Некоторые люди, сталкиваясь с проблемой, думают: «Я знаю, я буду использовать регулярные выражения. "Теперь у них есть две проблемы.

- Джейми Завинкси

Я говорю это в шутку, но итерация по String, как вы делаете, будет иметь производительность во время выполнения по крайней мере так же хорошо, как любое регулярное выражение - нет никакого способа, чтобы регулярное выражение могло делать то, что вы хотите быстрее; и у вас нет накладных расходов на компиляцию шаблона.

Так долго, как:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...