Groovy: простая работа с регулярными выражениями
Много есть аргументов как в поддержку языка программирования Groovy, так и против него. Но один мне кажется бесспорным: работать с регулярными выражениями — одно удовольствие (если, конечно, отвлечься от сложности самой темы регулярных выражений).
Для работы с регэкспами в Groovy введены два специальных оператора: =~ и ==~. Первый означает «такой шаблон встречается в данной строке», второй — «данная строка соответствует такому шаблону».
Сами регулярные выражения заключаются не между кавычками, а между слэшами, что очень удобно, особенно если кавычки присутствуют в самих выражениях и их приходится всячески экранировать. Кстати, специальные символы в регэкспах Groovy не требуют двойного экранирования, как это имеет место в Java. Т.е. вместо \\? можно писать просто \?, что, опять-таки, делает и без того лохматые регэкспы более читаемыми.
Рассмотрим несколько примеров. Допустим, у нас есть регистрационная веб-форма, заполняемая пользователем, и нам нужно проверить корректность введенной информации. Например, логин должен состоять строго из одного слова и содержать только латинские буквы и цифры, причем первой должна идти буква. Если условие не соблюдается — отправляем куда подальше с кодом ошибки 05:
Здесь регэксп —
и эти странные буковки не имеют никакого отношения к синтаксису Groovy. Так же страшненько они выглядели бы и в perl, и в bash. Для простоты понимания напишем так:
Теперь более наглядно можно увидеть, что в скобках после if кроется отрицание, обозначаемое знаком! (он как бы перечеркивает то, что идет после него)
То есть «если переменная login не соответствует шаблону /регэксп/, то вернуть код ошибки 5».
Продолжим проверять данные, введенные новым пользователем. Убедимся, что вместо своего имени он не написал какой-нибудь билеберды:
Здесь в переменной name1 допускаются уже не только латинские, но и кириллические буквы, что, кстати говоря, предусмотрено далеко не во всех языках, работающих с регэкспами (в bash'евском grep этого точно нет). Имя должно начинаться с буквы и может состоять более, чем из одного слова. Слова разделяются пробелами или черточками, как, например Ахалай-Бахалай или Ким Чен Ир.
Далее проверяется корректность адреса электронной почты:
Это выражение кажется вам слишком сложным? Значит вы еще не видели стандартного регэкспа для проверки корректности e-mail, прописанного в RFC-2822:
Ну и, наконец, проверяем, принимает ли пользователь правила сайта, для чего в регистрационной форме он должен поставить соответствующую галочку:
Здесь нет регулярных выражений. Привел эту строку просто чтобы показать, насколько в Groovy вообще легче работать со строками: для их сравнения можно использовать обычный оператор ==, а сами строки допускается заключать не только в двойные, но и в одинарные кавычки. В стандартной Java для сравнения строк на эквивалентность знак == использовать нельзя, вместо этого применяется метод equals().
Для работы с регэкспами в Groovy введены два специальных оператора: =~ и ==~. Первый означает «такой шаблон встречается в данной строке», второй — «данная строка соответствует такому шаблону».
Сами регулярные выражения заключаются не между кавычками, а между слэшами, что очень удобно, особенно если кавычки присутствуют в самих выражениях и их приходится всячески экранировать. Кстати, специальные символы в регэкспах Groovy не требуют двойного экранирования, как это имеет место в Java. Т.е. вместо \\? можно писать просто \?, что, опять-таки, делает и без того лохматые регэкспы более читаемыми.
Рассмотрим несколько примеров. Допустим, у нас есть регистрационная веб-форма, заполняемая пользователем, и нам нужно проверить корректность введенной информации. Например, логин должен состоять строго из одного слова и содержать только латинские буквы и цифры, причем первой должна идти буква. Если условие не соблюдается — отправляем куда подальше с кодом ошибки 05:
if(!(login ==~ /^[A-Za-z]\w+$/)) return 5
Здесь регэксп —
^[A-Za-z]\w+$
и эти странные буковки не имеют никакого отношения к синтаксису Groovy. Так же страшненько они выглядели бы и в perl, и в bash. Для простоты понимания напишем так:
if(!(login ==~ /регэксп/)) return 5
Теперь более наглядно можно увидеть, что в скобках после if кроется отрицание, обозначаемое знаком! (он как бы перечеркивает то, что идет после него)
!(login ==~ /регэксп/)
То есть «если переменная login не соответствует шаблону /регэксп/, то вернуть код ошибки 5».
Продолжим проверять данные, введенные новым пользователем. Убедимся, что вместо своего имени он не написал какой-нибудь билеберды:
if(!(name1 ==~ /^([A-Za-z]|\p{InCyrillic})+[\s-]?([A-Za-z]|\p{InCyrillic})+$/)) return 10
Здесь в переменной name1 допускаются уже не только латинские, но и кириллические буквы, что, кстати говоря, предусмотрено далеко не во всех языках, работающих с регэкспами (в bash'евском grep этого точно нет). Имя должно начинаться с буквы и может состоять более, чем из одного слова. Слова разделяются пробелами или черточками, как, например Ахалай-Бахалай или Ким Чен Ир.
Далее проверяется корректность адреса электронной почты:
if(!(email ==~ /^(\w[-._\w]*\w@\w[-._\w]*\w\.\w{2,3})$/))return 20
Это выражение кажется вам слишком сложным? Значит вы еще не видели стандартного регэкспа для проверки корректности e-mail, прописанного в RFC-2822:
^((?>[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_`{|}~]+)+|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]: ((?=[\x01-\x7f])[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$
Ну и, наконец, проверяем, принимает ли пользователь правила сайта, для чего в регистрационной форме он должен поставить соответствующую галочку:
if(agree == null || agree != 'on')return 30
Здесь нет регулярных выражений. Привел эту строку просто чтобы показать, насколько в Groovy вообще легче работать со строками: для их сравнения можно использовать обычный оператор ==, а сами строки допускается заключать не только в двойные, но и в одинарные кавычки. В стандартной Java для сравнения строк на эквивалентность знак == использовать нельзя, вместо этого применяется метод equals().
Комментарии (3)
RSS свернуть / развернутьMarkony
но в плане сравнения там есть перегрузка оператора =
сравнивайте наздоровье)
Gangsta
Sergei_T
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.