Анализ данных с помощью регулярных выражений или быстрый способ проверки введенных данных

18 августа, 2007

Все, кто хоть немного занимается программированием, сталкивались с проблемой правильности ввода данных. Основная сложность заключается в том, что большинство людей не любят читать справку к программе, не любят по несколько раз проверять введённые данные, зато очень любят быстро нажимать на все кнопки подряд, и громко жаловаться на малейшие ошибки в программе:-).

Регулярные выражения. Зачем они нужны?
Кроме того, существуют объективные причины возникновения ошибок. Например, усталость или некачественно составленная документация.

Все это приводит к тому, что программист вынужден тщательно проверять вводимые данные, и сообщать обо всех ошибках пользователю, объясняя при этом как эту ошибку исправить.

В большинстве случаев данные от пользователя поступают в виде текстовых строк. Т.е. нам нужно преобразовать данные к определённому типу.
И вот здесь все зависит от того, какие именно данные мы хотим получить.
Если нам нужен просто какой-нибудь текст (например, имя пользователя), то проверка достаточно простая:

Code (java)
  1. if(name == null || name.equals("")) {
  2. //сообщение об ошибке
  3. }

Мы просто убеждаемся, что что-то введено.
Проверить правильность ввода чисел тоже несложно. Можно воспользоваться методами parse… классов Double, Integer и т.п.

Например,

Code (java)
  1. try {
  2.     int v = Integer. parseInt(inputString);
  3. }
  4. // сообщение об ошибке
  5. }

Но, есть данные, для которых используется специальная форма записи. Например, адреса eMail, телефонные номера и т.п.

Проверку таких данных выполнить сложнее. Нужно проверять наличие обязательных элементов (например, символ @ в адресе eMail), их взаимное расположение и т.д.
Кроме того, могут возникнуть дополнительные задачи. Например, выделение кода города из телефонного номера.
Конечно, для выполнения таких проверок можно написать специальную функцию, содержащую один или несколько циклов, в которых будет выполняться проверка соответствия строки всем требованиям. Но в этом случае, зачастую, получается, что объем кода, выполняющего эти проверки, составляет, чуть ли не половину всей программу (если не больше).

К счастью, существует ряд методов, позволяющих существенно упростить задачу.
Об одном из них я и хочу рассказать. Этот метод заключается в использовании регулярных выражений (regular expressions).
Никогда о них не слышали? Не страшно. Я уверен, что вы постоянно ими пользуетесь. Например, если вам нужно найти все файлы с расширением mp3, то в программе поиска вы пишите “*.mp3″. Это и есть регулярное выражение. В данном случае программа поиска выдаст вам список файлов, у которых имя состоит из любого количества любых символов, после имени идет символ “.”, а за ним – “*mp3″. Если вы напишите “A*.mp3″, то получите список файлов, которые начинаются на букву “A”, и имеют расширение “mp3″.

Вообще, регулярное выражение представляет собой шаблон, с которым можно сравнивать текстовые строки. В приведённом примере, программа поиска сравнивает все имена файлов с заданным шаблоном, и показывает только те, которые с ним совпали.

Средства Java для работы с регулярными выражениями

В стандартную библиотеку Java входит пакет, специально предназначенный для работы с регулярными выражениями - java.util.regex.
Эта библиотека может быть использована для выполнения таких задач:

  • поиск данных;
  • проверка данных;
  • выборочное изменение данных;
  • выделение фрагментов данных;
  • и др..

Получить подробную информацию о библиотеке можно из официальной справки к JavaSDK, размещённой на сайте java.sun.com. Здесь же можно почитать The Java Tutorial (учебное пособие по Java), в котором регулярным выражениям посвящён отдельный урок.

В этой статье я хочу показать примеры использования регулярных выражений для проверки правильности ввода данных, и извлечения фрагментов этих данных.
Основную работу выполняют два класса: Pattern и Matcher.
Pattern – представляет собой сам шаблон, т.е. наше регулярное выражение.
Matcher – это объект, который выполняет сравнение заданной строки с шаблоном.
Для того чтобы создать объект типа Pattern нужно воспользоваться его статическим методом
compile(< регулярное выражение >) или
compile(< регулярное выражение >, <параметры>).
Создать Matcher можно с помощью объекта Pattern.

Например, так:

Code (java)
  1. Pattern p = Pattern.compile("^\\s+",
  2.     Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
  3. Matcher m = p.matcher(inputString);

После этого можно сравнивать шаблон со строкой, выполнять поиск нужных фрагментов и т.д.
Но, прежде всего, давайте разберёмся, как составлять регулярные выражения.

В простейшем случае регулярное выражение представляет собой просто текст, например, “стол”. Такое выражение можно использовать для поиска слова “стол” в строке, для замены этого слова на какое-нибудь другое и т.д..

Для создания более сложных выражений используются специальные символы (метасимволы). К ним относятся: ([{\^$|)?*+.. Эти символы имеют специальное значение, которое зависит от их положения в выражении.

Но, что будет, если мы захотим использовать эти символы в выражении в их обычном значении? Для этого нужно перед этим символом поставить \.

Внимание: если регулярное выражение записано в программе, а не читается из файла или формы, то необходимо использовать два символа \ подряд (\\). Вы, конечно, помните, что при обработке строк Java считает символ \ служебным (начало эскейп-последовательности), а для того, чтобы получить просто \ нужно ввести \\.

Теперь посмотрим, как можно использовать специальные символы при составлении выражений. Наверное, наиболее распространённый символ – это “.“. Он означает – любой символ. Если поставить справа от символа знак “+“, то это будет означать, что предыдущий символ может встречаться несколько раз. Поясню сказанное на простых примерах:
выражение “.+” будет соответствовать любому тексту (один или более любых символов);
A.+” – любое выражение, которое начинается на букву “А”.
Если мы хотим найти текст с известным расположением в строке, то можно воспользоваться символами:
^ - начало строки
$ - конец строки

С помощью квадратных скобок ([]) можно задать класс символов. Класс символов задаёт некоторый набор символов, который можно использовать в выражениях. Например, выражение “[кп]от” соответствует словам “кот” и “пот”.
Вот ещё несколько примеров использования классов символов.

[^abc] любые символы кроме abc (в данном случае символ ^ используется как отрицание)
[a-d[m-p]] любые символы от a до d и от m до p (по алфавиту)
[a-z&&[^bc]] любые символы от a до z кроме b и c

Кроме этого существуют, так называемые предопределённые классы. Например,

\d означает любую цифру
\D любые символы кроме цифр
\s пробельные символы ([ \t\n\x0B\f\r])
\S любые символы кроме пробельных
\w любые текстовые символы [a-zA-Z_0-9] (как вы заметили сюда символы русского алфавита не входят, как их включить, я покажу позже)
\W любые не текстовые символы

Страницы: 1 2 3

Понравилась статья? Подпишитесь на продолжение rss link !

Добавьте эту страницу в google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

Опубликовано в Java

Комментарии (3)

Вы можете отслеживать обсуждение записи с помощью RSS 2.0 rss link

Вы также можете оставить комментарий, или трекбек с Вашего сайта.

  1. Ven 10.01.2008 в 18:03 (Ответить)

    Спасибо за Вашу статью!
    Самое толковое объяснение регулярных выражений для Java, из всех что я нашел на русском.
    Прочитал и решил свою задачу. :)

    1. Владимир 10.01.2008 в 22:33 (Ответить)

      Спасибо!
      Очень приятно читать такие комментарии :-)

  2. Саня 04.02.2008 в 12:41 (Ответить)

    Спасибо :)
    Действительно помогает разобраться с регулярными выражениями :)

Оставить комментарий

Введите ваш комментарий

* - обязательные для заполнения поля

Quicktags: