std::regex 的编译时构建

Compiletime build up of std::regex

因为我知道编译时的正则表达式,并且构建正则表达式的时间复杂度为 O(2^m),其中 m 是正则表达式的长度,所以我很乐意在编译时构建正则表达式。

std::regex 可以吗? (我不这么认为,因为我没有看到 basic_regex 的任何 constexpr 构造函数)

如果没有,是否有可以在编译时构建我的正则表达式的正则表达式库?

我们需要区分program compile 和regex compile。后者实际上是在一个程序 运行 时间内完成的,它意味着构建一个大型但高效的结构(状态机),适用于快速匹配各种字符串。

在c++11 regex中,当你构造一个字符串的regex对象时,regex编译就完成了:

std::regex e (your_re_string);

如果您在 regex_matchregex_searchregex_replace 中使用此类对象,则可以利用 already-compiled 正则表达式。所以,如果你在程序编译时知道你的字符串,为了速度你能做的最好的事情就是为每个程序构造一个相应的正则表达式对象 运行,比如说,将它声明为静态变量带有初始值设定项:

static  std::regex e (your_constant_re_string);

应该就是你想要的吧

某些形式的 regex_match, ... 函数可能会立即与正则表达式字符串一起使用。但是请注意,虽然它通常对程序员来说更方便,但是如果你使用它们,每次调用这样的函数时都会进行正则表达式编译,性能会受到影响。

P.S。如果你真的,真的,真的想要在程序编译时编译正则表达式,你可以 (1) 使用外部 regexp/lexer 编译器软件(如 https://github.com/madelson/PrecompiledRegex.Fody, Flex https://en.wikipedia.org/wiki/Flex_(lexical_analyser_generator) 或类似软件) (2) 编译一个std::regex对象,然后序列化并转换为C++输入(其实就是(1)的DIY版) 但我很确定,如果只是想为每个程序保存一个正则表达式编译,那是不值得的 运行。也许除非你真的有压倒性的表情。

Hana Dusikova "Regular Expressions Redefined in C++” described an approach to compile-time regular expressions using a user-defined literal for regex strings and a compile-time approach to generating the matching function. The code is on GitHub 在 CppCon 2017 上发表的闪电演讲,但目前仍处于试验阶段并且非常流畅。所以看来编译时正则表达式可能很快就会出现。