2016-11-04 3 views
9

Я работаю с std::regex в моем проекте. Поскольку я знаю регулярные выражения в compiletime, а создание регулярного выражения находится в O (2^m), где m si длина регулярного выражения, я хотел бы создать регулярное выражение в compiletime. Возможно ли это с станд :: регулярное выражение? (Я не думаю, что это так, потому что я не вижу constexpr CTOR для basic_regex) И если не есть регулярное выражение, которое может libary раскачка мои регулярные выражения в compiletimeCompiletime build of std :: regex

+0

Лично я различаю время компиляции, время запуска и время выполнения. (Технически время запуска - время выполнения). Я создаю свое 'regex' во время запуска. – knivil

ответ

5

Мы должны различать между программа компиляция и regex компиляция. Последнее действительно выполняется во время выполнения программы, и это означает создание большой, но эффективной структуры (конечного автомата), подходящей для быстрого сопоставления с различными строками.

в C++ 11 регулярных выражений, регулярное выражение компиляции выполняется, когда вы построить регулярное выражение объекта строки:

std::regex e (your_re_string); 

Если вы используете такой объект в regex_match, regex_search, regex_replace, вы берете преимущество работы с уже скомпилированным регулярным выражением. Итак, если вы знаете свою строку во время компиляции программы, самое лучшее, что вы можете сделать ради скорости, - это создать соответствующий объект регулярного выражения только один раз для запуска программы, скажем, если он где-то объявлен как статическая переменная с инициализатором:

static std::regex e (your_constant_re_string); 

Возможно, это то, что вы хотите.

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

P.S. Если вы действительно хотите, чтобы вы regexp, скомпилированные во время компиляции программы, вы можете использовать (44) https://github.com/madelson/PrecompiledRegex.Fody, или 44) , затем сериализуем и конвертируем в C++-вход (который на самом деле является версией DIY (1)). Но я совершенно уверен, что это не стоит, если нужно только для сохранения одного регулярного выражения для каждого прогона программы. Возможно, если у вас нет действительно подавляющих выражений.

+2

Спасибо за ваш ответ. Но разве нельзя было строить nfa/dfa для регулярного выражения в compiletime? С C++ 11 и constexpr это должно быть возможно, я думаю. – Exagon

+0

Теоретически да, но вы должны написать конструктор constexpr или дождаться его добавления. С 2014 года он ожидался в C++ 14 или C++ 17. Тем не менее, я не уверен, что он был добавлен. Если нет, вы можете внести свой вклад. Это техническая работа, но может случиться, что какой-то оператор еще не поддерживает constexpr. Помните, что стандарты C++ всегда преуспевают в их реализации :) –

+0

Если бы я хотел такой компилятор, я бы просто написал функцию «storeAsCPPSource (const regex &)» и создал простое приложение, которое компилирует и сохраняет объект. –

3

Разговор молнии на языке CppCon 2017 от Hana Dusikova "Regular Expressions Redefined in C++” описал подход к регулярным выражениям времени компиляции, используя определяемый пользователем литерал для строк регулярных выражений и метод времени компиляции для создания соответствующей функции. code is on GitHub, но все еще экспериментальный и очень жидкий в это время. Таким образом, похоже, что регулярные выражения для компиляции, вероятно, скоро появятся.

 Смежные вопросы

  • Нет связанных вопросов^_^