Как роутить url основанный на регулярных выражениях c++?

У меня есть регулярки и ассоциированные с ними обработчики, какие более быстрые способы находить регулярку, к которой подходит пришедший url чем просто последовательный перебор всех имеющихся регулярок? Для регулярных выражений используется бустовый движок.


Ответы (1 шт):

Автор решения: KoVadim

Возникала подобная проблема. И самое лучшее, что нашел - это объединить выражения в группы и дальше простым if сразу выбирать группу. Также тяжелые регулярки обрамляются "простыми условиями".

То есть, если регулярка должна начинаться на "/doc", дальше за ней идет длинный хвост регулярки и больше нет урлов, которые начинаются на "/doc", то просто пишем

if (url[0] == '/' && url[1] == 'd') {
  //а тут уже полноценная регулярка
}

substr лучше не использовать - лишнее выделение памяти не к чему.

У меня такой подход дал где то двукратное ускорение в обработке "роутинга".

Но у этого способа есть большой недостаток - если сама регулярка поменялась, то нужно и условия обновить.

Второй способ - делать дерево с урлов и будет не линейное время, а за логарифм. Но он будет достаточно эффективен, если урлов хотя бы десяток-другой. Этот способ похож на предыдущий, но тут система многоуровневая и при правильном подходе возможно и не нужны будут регулярки.

→ Ссылка