Fork me on GitHub
#clojure-russia
<
2016-01-05
>
rm07:01:56

А кто умеет на кложе регекспы композировать? Мне в голову только довольно дурацкий вариант пришел (re-pattern (str "(" regex1 "|" regex2 ")"))

artemyarulin07:01:15

а прогнать по одному регэкспы так сильно медленнее будет чем если их скомпозить?

niquola08:01:03

ziatacbetanka

abtv09:01:40

@rm типа того, выигрыш будет, если у тебя много одиночных выражений. У меня было порядка тысячи и это дало колоссальный прирост производительности (как минимум несколько сотен раз). Мне ещё нужно было определять номер сработавшего выражения, так что я использовал номер возвращенной группы. Тебе нужно каждое выражение брать в круглые скобки, если важен номер сработавшего выражения.

abtv09:01:43

А вообще там производительность зависит от самих выражений, но, как правило, если n выражений собрать в одно, то можно считать, что будет в n раз быстрее (ну или около того, спец тестов не делал, только на одной конкретной задаче проверял и там это работало). Насколько я понимаю, Regex строит дерево из выражений и хорошей аналогией будет двоичный поиск - когда строка подана на вход, механизм regex не перебирает их линейно, а отбрасывает много вариантов на каждом новом символе.

abtv09:01:28

Но с несколькими выражениями в одном Regex есть и проблемы: если у тебя на строке должно сработать сразу несколько выражений, то тут важно, является ли одно из них надмножеством другого и, если является, то ты получишь только одну группу из двух.

artemyarulin09:01:49

@abtv: спасибо за инфу, не знал

abtv13:01:24

@artemyarulin: не за что, я некоторое время назад пилил своего рода regex'овый highload, много интересных вещей всплыло, а с этим вариантом нужно быть очень аккуратным и тестить все edge cases

dottedmag13:01:57

@abtv: Похоже на один конкурс, который я видел недавно. Или это было в продакшн?

abtv14:01:03

@dottedmag: Production самый что ни на есть. А что за конкурс? simple_smile

abtv15:01:21

@dottedmag: Забавно, что парсинг почты был одной из задач, которые я решал 😄

rm16:01:37

abtv: спасибо за подробное объяснение. Я просто хотел как-то аннотировать регулярки. По твиттору гуляет какое-то конченное решение -- собирать регулярку чейном методов, я подумал, что должно быть лучше.

larhat16:01:05

@rm аннотировать в смысле коментов? pcre поддерживает комментарии (?# comment )

rm19:01:29

larhat: ну и переиспользовать тоже. В общем, местами можно и комменты, а местами придется в str конвертить

ul20:01:36

@rm так может тебе и не регулярки лучше подходят? грамматики лучше компоузятся, можно https://github.com/engelberg/instaparse пустить в дело

rm20:01:52

может

rm20:01:57

на самом деле точно

rm20:01:18

но тут задача наложилась на этот дурацкий твит :)