clojure-russia 2018-03-16

Господа, а какой парсер для текста вы посоветуете?

Мне не языки программирования, а строчки типа 24X7 TR PO ISSUE 5675676 ECABS OPERATORS COMPANY LIMITED EUR44.00 IVAN IVANOV COMMISSION: EUR 1.00 REF : 666-31/12/2000-6666-77-4 парсить.

И этих строчек 50 вариантов.

В #clojure подсказали instaparse и особенно instaparse.combinators

👍 2

https://github.com/blancas/kern очень простой и работает

из парсер комбинаторов

правда чувак все никак поддержку cljs не смержит https://github.com/blancas/kern/pull/14

@prepor Спасибо, попробую.

Что-то с instaparse не удалось с наскока сделать парсер "если в конце строки есть REF : \d\d\d-\d\d/\d\d/\d\d\d\d-\d\d\d\d-\d\d-\d, то один вариант, а если нет, то другой".

Потому что перед этим REF ... текст в произвольной форме может быть, и всякие варианты .* сжирают и конец строки тоже.

@alpha.ru has joined the channel

((insta/parser
     "line = refline | other
     refline = whatever ref nums
     whatever = #'.*(?=REF:)'
     <ref> = <'REF:'>
     nums = #'\\d\\d\\d-\\d\\d/\\d\\d/\\d\\d\\d\\d-\\d\\d\\d\\d-\\d\\d-\\d'
     other = 'hello'" ) "555REF:123-12/12/1234-1234-12-1")
=> [:line [:refline [:whatever "555"] [:nums "123-12/12/1234-1234-12-1"]]]

А, негативный lookahead забабахать? Это вариант.

@ilevd Спасибо.

Точнее, это позитивный. Но можно и негативный.