Внимание! Это сайт переехал на www.simplecoding.org
Регулярные выражения. Зачем они нужны?
Средства Java для работы с регулярными выражениями
Удаление лишних пробелов
Проверка формата телефонного номера
Разбивка строки на лексемы
Проверка имени и пароля
Проверка формата адреса eMail
Скачать примеры программ
Заключение
Теперь давайте посмотрим примеры использования регулярных выражений для решения конкретных задач.
Удаление лишних пробелов
При вводе данных в форму пользователь может случайно поставить несколько пробелов (или знаков табуляции) до начала текста или в его конце. Эти пробелы обычно не несут никакой информации и их нужно удалить.
В первую очередь создадим необходимые нам шаблоны. Для выделения пробелов в начале строки нам
подойдет "^\\s+". Символ ^ означает
начало строки, а \\s+ - один или более пробелов. Для того чтобы
удалить пробелы можно воспользоваться методом replaceFirst("")
класса Matcher с пустой строкой в качестве параметра. Этот метод
заменяет первый найденный фрагмент строки, который соответствует регулярному выражению, на заданную
строку.
Например:
Pattern p = Pattern.compile("^\\s+"); Matcher m = p.matcher(input); String output = m.replaceFirst("");
Для выделения пробелов в конце строки немного изменим шаблон "\\s+$". Практически тоже самое, только в конце выражения стоит символ $, который означает конец строки.
Код для использования шаблона будет выглядеть примерно так:
p = Pattern.compile("\\s+$"); m = p.matcher(output); output = m.replaceAll("");
Это продолжение предыдущего фрагмента кода, поэтому строка output используется как исходная строка. Т.е. сначала мы удаляем пробелы в начале строки, а потом – в её конце. Метод replaceAll, в отличие от replaceFirst заменяет на заданную строку (в данном случае "") все фрагменты строки, которые соответствуют шаблону. Для этой программы не играет роли, каким методом мы воспользуемся, т.к. может быть только одна группа пробелов в начале строки, и одна – в конце.
Вы можете скачать программу для удаления пробелов, которая работает по описанному здесь методу. После запуска введите какую-нибудь строку, например: " привет ". В результате вы получите: "привет".
Проверка формата телефонного номера
Теперь посмотрим более сложный пример. Допустим, у нас есть форма, в которую пользователь должен
ввести номер телефона. Телефонные номера обычно записываются в виде групп цифр, разделенных
дефисами, но это не обязательно. Между цифрами могут быть пробелы, а могут и не быть. Кроме того,
номер может содержать код города, который обычно записывается в круглых скобках.
Т.е. возможны такие варианты записи:
555-33-44
555 – 43 – 78
(333) 44 – 55- 88
8-(022)-4-333-111
456789
Наша задача: проверить, насколько это возможно, правильность ввода номера.
Для этого можно воспользоваться таким регулярным выражением: "[\\d\\s()\\-]+
". Здесь в квадратных скобках мы определили класс символов, в который входят все цифры
\\d, все пробельные символы \\s,
круглые скобки и дефис. Знак + в конце выражения означает, что любой
из этих символов, может встречаться один или более раз.
Для того чтобы проверить соответствие введенного номера, нашему выражению, воспользуемся методом
matches() класса Matcher. Он
возвращает true, если заданная строка соответствует регулярному
выражению.
Например:
Pattern p = Pattern.compile("[\\d\\s\\(\\)\\-]+"); Matcher m = p.matcher(input); if(m.matches()) { System.out.println("\"" + input + "\" - OK"); } else { System.out.println("\"" + input + "\" - ERR"); }
Теперь попробуем выделить код города (если он есть) из номера. Для этого составим еще одно регулярное выражение – "\\([\\d]+\\)". Здесь мы задаем последовательность символов. Первой должна идти открывающая круглая скобка, за ней – одна или более цифр, после них – закрывающая круглая скобка.
Для того чтобы найти часть строки, которая соответствует этому выражению, можно воспользоваться
методом find() класса Matcher.
Этот метод возвращает true, если в исходной строке найдена
заданная подстрока. Для того чтобы получить саму подстроку, нужно использовать метод
group().
Например:
Pattern codeP = Pattern.compile("\\([\\d]+\\)"); m = codeP.matcher(input); if(m.find()) { System.out.println("City code: " + m.group()); }
Вы можете скачать демонстрационную программу для проверки телефонных номеров.
Разбивка строки на лексемы
В первую очередь разберемся, что такое лексемы. Это фрагменты строки, которые находятся между символами разделителями. Например, в обычном предложении, лексемы – это слова, а символы разделители – это пробелы между ними.
Вообще-то, для того, чтобы разбить предложение на слова использовать регулярные выражения не обязательно. Можно воспользоваться классом StringTokenizer из пакета java.util. В его конструкторе можно задать строку с разделителями, а затем в цикле с помощью метода nextToken() получить все лексемы.
Но, что делать, если разделителем служит сложный фрагмент, состоящий из смешанных данных?
Рассмотрим конкретный пример. Допустим, у нас есть строка (или строки), которая содержит имена
и даты рождения. Мы точно знаем, что после имени идет символ двоеточия, а дата состоит из
какого-то набора цифр и дефисов. Имя может состоять из одного или нескольких слов.
Например:
Вова:2000-11-3Александр Петрович:1970-02-14Петя:1980-07-1Костя:1990-08-23
Нам нужно выделить все имена из строки. Для этого составим регулярное выражение, которое
соответствует разделителю, т.е. символу двоеточия, за которым следует дата. У меня получилось
такое выражение ":[\\d\\-]+". Первым идет двоеточие, за ним мы
объявляем символьный класс, в который входят все цифры и дефис. Символы из этого класса могут
встречаться один или более раз (знак +). После этого мы можем
воспользоваться методом split класса
Pattern для получения массива строк с именами.
Код, выполняющий эти операции, будет выглядеть примерно так:
Pattern p = Pattern.compile(":[\\d\\-]+"); String[] tokens = p.split(input);
Как видите, получить лексемы с помощью класса Pattern значительно проще, чем, используя StringTokenizer.
Вы можете скачать программу, демонстрирующую работу этого метода.
Предыдущий раздел Читать дальше