2016-03-21 54 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