def source = 'this is some string just string plain string' // во-первых, есть спец. форма записи строки, //в которой не требуется квотирование word = /\w+/ // оператор ~ позволяет прекомпилировать объект паттерна (так же поддерживает // подстановку подстрок). wholePattern тут - объект типа java.util.regex.Pattern wholePattern = ~/($word $word)*/ // это проверка (оператором ==~) что вся строка содержит // только слова, разделенные пробелами. assert source ==~ wholePattern // А это матчинг, операторв =~ создает объект матчера (java.util.regex.Macher). // Проверяем, что данному паттерну сооттствует три подстроки def finder = (source =~ "st..ng*") assert finder.getCount() == 3 |
Так получилось, что я работаю в мире Ынтерпрайза. Java, J2EE, Oracle и все такое. По этой части я интересуюсь HighLoad-ом и распределенными приложениями. Помимо этого, в свободное время занимаюсь интересными языками под JVM - Groovy, Scala, Clojure, а так же интересуюсь внутренностями Java и разработкой компиляторов и виртуальных машин.
понедельник, 17 января 2011 г.
Groovy - регулярные выражения на уровне синтаксиса языка
По сравнению с Java, в Groovy регекспы поддерживаются на уровне языка. Маленький пример.
Подписаться на:
Комментарии к сообщению (Atom)
Этот комментарий был удален автором.
ОтветитьУдалитьПредыдущее сообщение сломал парсер :(
ОтветитьУдалитьregexp match(str)
{
| <#(?< x : int >\d+)#> => WriteLine(x) // x имеет тип int
| <#(?< x >[a..z]+)#> => WriteLine(x) // x имеет тип string
| _ => WriteLine("не число и не буквы")
}
Это наш макрос regexp match :)
ОтветитьУдалить(какой же неудобный этот блогспот, мало того, что умудряется в
Хроме тормозить, еще и комментировать неудобно)
Хм, странно - у меня в хроме ниче не тормозит.
ОтветитьУдалитьА можно немного подробнее для тех кто в танка, как этот макрос примерно работает и что делает? На вид похоже нечто вроде switch-a, где в качестве кейсов - регексы? Или я неправ?
Да, это match в кейсах которого находятся строки - регулярные выражения .NET, при том макрос их разбирает и находит именованые группы (?< >....), для которых создает переменные. При удачном сопоставлении эти переменные получают значение из спосоставляемой строки. В сущности эта штука компилируется в лесенку if-ов.
ОтветитьУдалитьА с Хромом разобрался - заблокировал AdBlock-ом фоновое изображение (оно абсолютно спозиционировано и растянуто). Прокрутка блога стала заметно легче.
Ах да, забыл рассказать про <# #>. В Nemerle есть три типа строковых литералов:
ОтветитьУдалить1) "..." обычный литерал, в сишном стиле, для него работают стандартные сишные и юникодные эскейп-последовательности
2) @"..." вербатим-литерал, как в C#, для него есть только одна эскейп-последовательность - это идущие подряд две двойные кавычки. Сишные и юникодные эскейпы игнорируются. Удобна для записи путей на диске (не нужно экранировать слэши).
3) <#...#> рекурсивная строка. Может содержать что угодно - даже пары <# #>. Используется для записи литералов, содержащих кавычки и для построения DSL-ей, например LINQ и XML-литералы сделан на этих строках.
Чтож, удобно. В груви есть наверное, 5 типов строковых литералов. Обычный строки, многострочные обычные строки, GStrings (строки в которых резолвятся выражения типа "My name is ${user.name}", многострочные GString, и /.../ строки, внутри которых не надо эскейпить \w, \d, и прочие классы символов - удобно для регулярок.
ОтветитьУдалитьДа, $-нотация это крутая штука (называются сплайсы), мне их отчаянно нехватает в C# (string.Format сливает) :(
ОтветитьУдалитьА Nemerle умеет вот так:
def name = "Mary";
def fruits = [ "apple", "orange", "lime" ];
$<#$name has ..$(fruits; ", ").#>
На выходе получится строка:
"Mary has apple, orange, lime."
Понимает следующие эскейпы: $имя, $(выражение), ..$(коллекция; разделитель).
Ну в груви строго говоря внутри фигурных скобок может быть любое выражение (в т.ч. лямбда или замыкание), которое возвращает какое-то значение, которое можно привести к строке.
ОтветитьУдалитьПример:
def factorial(n) { n == 1 ? 1 : n * factorial(n - 1) }
def n = 11
println "This is factorial of $n = ${factorial(n)}"
Output:
This is factorial of 11 = 39916800