Exa*_*gon 13 c++ regex compile-time-constant c++11
我std::regex在我的项目中工作.由于我在编译时知道正则表达式,并且构建正则表达式是在O(2 ^ m)中,其中m是正则表达式的长度,我希望在编译时建立正则表达式.这可能与std :: regex一起吗?(我不这么认为,因为我没有看到任何constexpr ctor basic_regex)如果没有,那么有一个正则表达式库可以在编译时构建我的正则表达式
leg*_*ize 10
Hana Dusikova的CppCon 2017闪电讲话"用C++重新定义的正则表达式"描述了一种编译时正则表达式的方法,使用用户定义的文本用于正则表达式字符串和编译时方法来生成匹配函数.代码在GitHub上,但目前仍然具有实验性和高度流动性.因此,似乎编译时正则表达式可能会很快出现.
我们需要区分程序编译和正则表达式编译.后者实际上是在程序运行时完成的,它意味着构建一个适合快速匹配各种字符串的大而有效的结构(状态机).
在c ++ 11正则表达式中,在构造字符串的正则表达式对象时完成正则表达式编译:
std::regex e (your_re_string);
Run Code Online (Sandbox Code Playgroud)
如果您在使用这样的对象regex_match,regex_search,regex_replace,你用一个已编译的正则表达式工作的优势.所以,如果你在程序编译时知道你的字符串,那么为了速度你可以做的最好的事情是每个程序运行只构造一次相应的正则表达式对象,比如说,将它声明为带有初始化程序的静态变量:
static std::regex e (your_constant_re_string);
Run Code Online (Sandbox Code Playgroud)
可能它就是你想要的.
某些形式的regex_match...函数可能会立即使用正则表达式字符串.但是请注意,虽然对程序员来说通常更方便,但如果你使用它们,每次调用这样一个函数时,性能都会受到正则表达式编译的影响.
PS如果你真的,真的,真的希望有你在程序编译的正则表达式编译的时候,你可以(1)使用外部的正则表达式/词法编译器软件(如https://github.com/madelson/PrecompiledRegex.Fody,软硬https://en.wikipedia.org/wiki/Flex_(lexical_analyser_generator)或类似的)(2)编译一个std::regex对象,然后序列化并转换为C++输入(实际上是(1)的DIY版本)但我很确保如果只是为了在每个程序运行中保存一个正则表达式编译而不值得.也许除非你真的压倒性的表达.
| 归档时间: |
|
| 查看次数: |
5056 次 |
| 最近记录: |