11 January 2017

C++ regex

Пощупал малость регулярки из std (которые, на самом деле, есть малость перелицованные Boost.Regex).
Довольно странные ощущения, впрочем, как практически от любой штуки из STL.


Например, мне слету понадобилась функция escape для строки. А нет ее -- "сделай сам™". При этом в Qt, естественно, такая штука сразу под рукой -- QRegExp::escape().

Возникли вопросы к regex_replace()... Вот почему мы регулярку всегда передаем в виде класса basic_regex<>, а не в виде строки, из которой его можно сконструировать? Очевидно, с целью оптимизации -- если одно и тоже выражение нужно использовать несколько раз, то такой подход позволяет существенно экономить на том, что разбор строки, описывающей регулярку, и генерация некоего автомата для ее исполнения, может происходить только один раз и сохраняться в экземпляре класса basic_regex<>. В случае regex_replace() у нас еще есть входной аргумент fmt, который описывает что именно надо подставить в найденные места, это такая строка с хитрыми плейсхолдерами, заэскейпленными символами и т.д. и т.п. Очевидно, что этот параметр при использовании надо парсить, причем парсить по достаточно сложным правилам, и в случае, если вам надо будет вызывать один и тот же regex_replace() для большого количества разных строк, у вас не будет никакой возможности сэкономить на этом парсинге... Ну как так, блин, можно было задизайнить либу, да еще и умудриться протащить еще через всю бюрократию и комитеты в стандарт?

И они еще борются за почетное звание дома высокой культуры и быта...

No comments:

Post a Comment