Groovy: простая работа с регулярными выражениями

Много есть аргументов как в поддержку языка программирования Groovy, так и против него. Но один мне кажется бесспорным: работать с регулярными выражениями — одно удовольствие (если, конечно, отвлечься от сложности самой темы регулярных выражений).


Для работы с регэкспами в 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().
  • +5
  • 21 июля 2010, 16:23
  • yababay

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

RSS свернуть / развернуть
+
0
КРАСОТА !Полезно! С++ пригодится…
avatar

Markony

  • 21 июля 2010, 16:37
+
0
В C++ такого не будет никогда
но в плане сравнения там есть перегрузка оператора =
сравнивайте наздоровье)
avatar

Gangsta

  • 21 июля 2010, 17:50
+
0
Сколько я пытался осилить тему регулярных выражений — так и не получилось. Может быть есть простое хауту?
avatar

Sergei_T

  • 21 июля 2010, 23:19

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.