22
June

Регулярные выражения в Java (regexp)

Posted in: Java technologies, J2SE |

Регулярные выражения (Regular Expressions) позволяют сопоставлять текст с указанным шаблоном, а также выполнять замену текста. Эти операции осуществляются с помощью универсальных символов, которые специальным образом интерпретируются.
Регулярные выражения используются в большом количестве языков программирования.
В Java тоже есть пакет, который позволяет работать с ними - java.util.regex.

Пакет состоит всего из трех классов: Matcher, Pattern, PatternSyntaxException.
Pattern - скомпилированное представление регулярного выражения.
Matcher - движок, который производит операцию сравнения (match).
PatternSyntaxException - указывает на синтаксическую ошибку в выражении.
Последовательность вызова методов при работе с regexp:

Pattern p = Pattern.compile(“a*b”);
Matcher m = p.matcher(“aaab”);
boolean b = m.matches();

Как видно из примера, регулярное выражение сперва должно быть откомпилировано. Результирующий объект может быть использован для создания объекта Matcher на основе java.lang.CharSequence (String). Matcher в свою очередь вызывает метод matches().
Регулярные выражения очень полезны при server- и client-side валидации данных.
Давайте рассмотрим небольшой пример. Допустим, необходимо проверить корректность e-mail адреса.

import java.util.regex.*;

public class TestRegexp {
    public static final Pattern pattern = Pattern.compile
            (“[a-zA-Z]{1}[a-zA-Z\d\u002E\u005F]+@([a-zA-Z]+\u002E){1,2}((net)|(com)|(org))”);

    public static void doMatch(String word) {
        String output = “Validation for “” + word + “””
        Matcher matcher = pattern.matcher(word);
        if (matcher.matches())
            output += “ passed.”
        else
            output += “ not passed.”
        System.out.println(output);
    }

    public static void main(String[] args) {
        doMatch(“c0nst@money.simply.net”);
        doMatch(“somebody@dev.com.ua”);
        doMatch(“Name.Sur_name@gmail.com”);
        doMatch(“useR33@somewhere.in.the.net”);
    }
}

Последовательность вида [a-zA-Z] указывает на множество. {n} говорит о том, что некоторый символ должен встретится n раз, а {n,m} - от n до m раз. Символ \d указывает на множество цифр. “\u002E” и “\u005F” - это символы точки и подчеркивания соответсвенно. Знак плюс после некоторой последовательности говорит о том, что она должна встретится один или более раз. “|” - представление логического “или”. Полное описание всех конструкций можно найти в Java API.
В нашем примере под Pattern будут подходить те e-mail адреса, которые начинаются с буквы, содержат буквы, цифры, точку и подчеркивание до символа “@” и находятся в доменах com, net, org (не более третьего уровня).
А вот и результат выполнения программы:

Validation for “c0nst@money.simply.net” passed.
Validation for “somebody@dev.com.ua” not passed.
Validation for “Name.Sur_name@gmail.com” passed.
Validation for “user33@somewhere.in.the.net” not passed.

Не так давно я вообще не знал, что такое регулярные выражения. Теперь же они во многом мне помогают.

10 Comments »

RSS feed for comments on this post. TrackBack URI



March 10, 2006 #

Отличное регулярное выражение для проверки email: http://www.ex-parrot.com/~pdw/Mail-RFC822-Address.html

Volov Alexander
May 10, 2006 #

это я думаю лучший способ проверки:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ggggg {

public static void checkEmail(String sEmail) {
String sDomen = “[a-z][a-z[0-9]\u005F\u002E\u002D]*[a-z||0-9]”;

//String sDomen2 = “([a-z]){2,4}”;
// variant two (net||org||ru||info … ||jp)
String sDomen2 = “(net||org||ru||info)”;

Pattern p = Pattern.compile(sDomen + “@” + sDomen + “\u002E” + sDomen2);
Matcher m = p.matcher(sEmail.toLowerCase());

String sResult = m.matches()?sEmail + “: passed.”:sEmail + “: not passed.”;

System.out.println(sResult);
}

public static void main(String[] args) {
// TODO Auto-generated method stub

checkEmail(”mail@mail.ru”);
checkEmail(”mail@mail.org”);
checkEmail(”mail@mail.info”);
checkEmail(”mail@mail.”);
checkEmail(”mail@mail”);
checkEmail(”");
checkEmail(”sgfdsg”);
checkEmail(”m.a.i.l@mail.ru”);
checkEmail(”_mail@mail.ru”);
checkEmail(”mail_@mail.ru”);
checkEmail(”mail@_mail.ru”);
checkEmail(”mail@mail_.ru”);
checkEmail(”1mail@mail.ru”);
checkEmail(”mail1@mail.ru”);
checkEmail(”mail@mail1.ru”);
checkEmail(”m___ail@mail.ru”);
checkEmail(”C_fdhsfk4@mai32l.ru”);
checkEmail(”ma*il@mail.ru”);
checkEmail(”mail@ma^il.ru”);
checkEmail(”mail@mail.my.my1.ru”);
checkEmail(”@mail.my.my1.ru”);
checkEmail(”mail@mail.my.my1.u”);
checkEmail(”mail@.ru”);
checkEmail(”m l@ddd.ru”);
checkEmail(”mail@d d.r u”);
}
}

Vitaliy
August 2, 2006 #

Как работает zero-width positive lookahead ?

August 2, 2006 #

Ну это уже ближе к Pearl.
Например, тебе нужно отловить букву ‘i’, после которой идет ‘t’. Выражение ‘i[t]’ для цепочки ‘Vitaliy’ вернет тебе ‘it’. А вот zero-width positive lookahead - ‘i(?=t)’ - вернет тебе первую из букв ‘i’.

Пользователь
December 20, 2006 #

Ребята какую книгу лучше всего почитать ? что бы понять как работать с JAVA ? что ни найду.. такое угрюмое и не удобное всё.. жуть просто.

acridity
January 17, 2007 #

Не понял, почему email не может с цифры начинаться… Уж тогда добавьте [a-z\\d…
))

JHOn
March 29, 2007 #

Для начала советую прочитать книжку братьев Гарнаевых “Web-программирование на Java и JavaScript” , а потом Брюса У. Перри “Java сервлеты и jsp сборник рецептов”

goleon
August 29, 2007 #

Несмотря на то, что регулярное выражение не идеальная - статья простая и понятная. Только вот ссылочку на описание Java-Regex? Просто regex везде свой - в ПХП, JavaScript… И про точку и подчёркивание не понял. В пхп можно экранировать любой спецсимвол обратным слэшем, в ява так нельзя?

Sergey
May 20, 2008 #

можно
просто аффтар сделал как круто :)

Sidmaker
June 27, 2008 #

Мне кажется вот такой подход более понятен и воспринимается приятней, конечно можно добавить проверку на конкретную длину ну енто уже от программиста зависит на прямую ;)

Pattern pattern = Pattern.compile(”[a-zA-Z][\\w]*@[a-z]*.[a-z]*.?[a-z]*”);

Leave a comment

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>