Fork me on GitHub
#clojure-russia
<
2018-03-16
>
dottedmag08:03:03

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

dottedmag09:03:04

Мне не языки программирования, а строчки типа 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 парсить.

dottedmag09:03:19

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

dottedmag09:03:54

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

prepor12:03:23

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

prepor12:03:33

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

prepor12:03:31

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

dottedmag12:03:16

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

dottedmag12:03:02

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

dottedmag12:03:36

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

ilevd15:03:04

((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"]]]

dottedmag15:03:15

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

dottedmag15:03:19

@ilevd Спасибо.

dottedmag15:03:02

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