Как роутить url основанный на регулярных выражениях c++?
У меня есть регулярки и ассоциированные с ними обработчики, какие более быстрые способы находить регулярку, к которой подходит пришедший url чем просто последовательный перебор всех имеющихся регулярок? Для регулярных выражений используется бустовый движок.
Ответы (1 шт):
Возникала подобная проблема. И самое лучшее, что нашел - это объединить выражения в группы и дальше простым if сразу выбирать группу. Также тяжелые регулярки обрамляются "простыми условиями".
То есть, если регулярка должна начинаться на "/doc", дальше за ней идет длинный хвост регулярки и больше нет урлов, которые начинаются на "/doc", то просто пишем
if (url[0] == '/' && url[1] == 'd') {
//а тут уже полноценная регулярка
}
substr лучше не использовать - лишнее выделение памяти не к чему.
У меня такой подход дал где то двукратное ускорение в обработке "роутинга".
Но у этого способа есть большой недостаток - если сама регулярка поменялась, то нужно и условия обновить.
Второй способ - делать дерево с урлов и будет не линейное время, а за логарифм. Но он будет достаточно эффективен, если урлов хотя бы десяток-другой. Этот способ похож на предыдущий, но тут система многоуровневая и при правильном подходе возможно и не нужны будут регулярки.