2016-03-21 291 views
-1

您好,这是我的C++的正则表达式C++正则表达式速度优化

regex MyRGX(R"~((\w*)\s*[(]([^;]*)[)]\s*[;])~"); 

,这是我的字符串

Data1 (

    anything1 

); 

这个表达式得到 Data1();之间存在的任何条件的一切。但是当我有超过50个块像Data1,这个正则表达式的搜索速度将低于相当于pcre的正则表达式。我认为这是我的正则表达式,并非针对速度进行优化。你有任何建议,以提高这个条件的正则表达式的速度(得到一切存在之间();和...)?

+1

您的字符串看起来不像我的字符串。 – nwp

+0

你只是认为是。 – Elh48

+0

我的建议:尽可能使用非捕获组('(?:)'而不是'()')。如果可能,请使用'+'而不是'*'(因为'*'匹配空字符串,与'+'相比,有更多可能的分支需要探索)。最后,您可以在[构造函数](http://en.cppreference.com/w/)中使用['optimize'标志](http://en.cppreference.com/w/cpp/regex/basic_regex) cpp/regex/basic_regex/basic_regex)来获得更优化的正则表达式(以较慢的构造为代价)。我可能会建议'regex r(R“〜((\ w +)\ s * [(]([^;] *)[)] \ s * [;])〜”,regex_constants :: optimize | regex_constants :: ECMAScript );'。 – Cornstalks

回答

0

正如我之前提出的问题所怀疑的那样,这看起来像是正则表达式不是最合乎逻辑的解决方案。

“正则表达式”来自描述“正规语言”的“正则表达式”。带有匹配圆括号的语言(如C++本身)并不规则。现在,我们称之为“正则表达式”已经发展到包括一些非常规语言,但这不是最佳的。

在这种情况下,它看起来像一个完美的普通解析器可以工作。据我了解,目标是寻找();之间的任何东西。所以做一个简单的文本搜索前向(,倒退);。检查两者是否都找到,并且();之前,那么只需使用找到的索引对来提取子字符串。

+0

提供可以使用标准库函数实现的O(N)解决方案,用于可证明具有O(N)边界的事物。获得-1。 – MSalters