clojure-russia

Работа и релокейт: #jobs-rus | #clojure-russia-offtop Телеграм-чат https://t.me/clojure_ru
dottedmag 2018-03-16T08:59:03.000498Z

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

dottedmag 2018-03-16T09:00:04.000402Z

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

dottedmag 2018-03-16T09:00:19.000316Z

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

dottedmag 2018-03-16T09:09:54.000090Z

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

2👍
prepor 2018-03-16T12:39:23.000347Z

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

prepor 2018-03-16T12:39:33.000265Z

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

prepor 2018-03-16T12:40:31.000166Z

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

dottedmag 2018-03-16T12:41:16.000346Z

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

dottedmag 2018-03-16T12:42:02.000203Z

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

dottedmag 2018-03-16T12:42:36.000058Z

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

ilevd 2018-03-16T15:03:04.000029Z

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

ilevd 2018-03-16T15:03:27.000054Z

https://www.programcreek.com/2010/12/regular-expression-exclude-a-wordstring/ так вроде норм

dottedmag 2018-03-16T15:43:15.000734Z

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

dottedmag 2018-03-16T15:43:19.000515Z

@ilevd Спасибо.

dottedmag 2018-03-16T15:44:02.000290Z

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