Comments 9
Если мы отказываемся от компактного синтаксиса регулярных выражений, то лучше уж сразу перейти к комбинаторным парсерам.
Примеры на scala: http://www.artima.com/pins1ed/combinator-parsing.html. Мой опыт с ними: https://habrahabr.ru/post/176285/
Пример с byte на парсерах:
object byteParser extends JavaTokenParsers {
def digit = elem("digit", '0' to '9' toSet)
def top = "25" ~ elem("0 to 5", '0' to '5' toSet)
def middle = '2' ~ elem("0 to 4", '0' to '4' toSet) ~ digit
def low = ("0" | "1") ~ digit ~ digit | digit ~ digit.?
def byte = top | middle | low
def apply(s: String) = parseAll(byte, s)
}
println(byteParser("256"))
//failure: 0 to 5 expected
//
//256
// ^
Дам всего один простой совет: если не можете прочитать сложное регулярное выражение- в коде в комментарии к нему указывайте ссылку на regex101, там редактируйте его с подсветкой синтаксиса, подсказками, тестами. И не забывайте про режим eXtended- в нем регулярные выражения любой сложности читаются очень легко.
Сложное регулярное выражение на DSL будет гораздо большим трэшем, чем его обычная запись, как мне кажется.
Это да, потому и не стал цитировать пункт целиком. Более того, я боюсь что в этой войне его вообще не победить. Максимум, что можно было бы сделать (да и то хз как) — запретить форматировать конкретный кусок. Но, на мой взгляд, вторая проблема (динамический запрос) даже хуже.
А у вас хорошо получилось, статическая типизация — наше всё.
DSL для регулярных выражений на Kotlin