2016-06-08 37 views
2

我解析看起來像下方的多行文字記錄:的C++ 0x的正則表達式的作品鏗鏘而不是用gcc 4.9.2

> UniRef50_A0A091LJV8 Lysozyme g (Fragment) n=2 Tax=Chlamydotis 
macqueenii RepID=A0A091LJV8_9GRUI 
Length=186 

Score = 114 bits (285), Expect = 3e-30, Method: Compositional matrix adjust. 
Identities = 54/83 (65%), Positives = 65/83 (78%), Gaps = 0/83 (0%) 

Query 1 ASCKTAKPEGLSYCGVSASKKIAERDLQAMDRYKTIIKKVGEKLCVEPAVIAGIISRESH 60 
     AS TA+PEGLSY GVSAS+KIAE+DL+ M +++ I +V  V+PA+IAGIISRESH 
Sbjct 17 ASEATARPEGLSYAGVSASEKIAEKDLKNMQKHQDKITRVANSKGVDPALIAGIISRESH 76 

Query 61 AGKVLKNGWGDRGNGFGLMQVDK 83 
      G VL+NGWGD N FGLMQVDK 
Sbjct 77 GGTVLENGWGDHNNAFGLMQVDK 99 

我用幾個正則表達式來從這些記錄中提取數據。當他們用clang(MacOS X)和gcc 4.9.2(Ubuntu)編譯時,它們都工作。然而,其中一個用gcc編譯時會拋出regex_error。這裏是最小的(非) - 工作實例:

#include <regex> 

const std::string regex_string_OK_1 = "\\[(.+?)\\]"; 
const std::string regex_string_OK_2 = "Tax\\s*?=\\s*?([\\n\\w ]*?)\\s*?RepID"; 
const std::string regex_string_PROBLEM = "Query\\s+?(\\d+?)\\s+?([_\\-[:alnum:]]+?)\\s+?(\\d+?)\\n.+?\\nSbjct\\s+?(\\d+?)\\s+?([_\\-[:alnum:]]+?)\\s+?(\\d+?)\\n"; 

int main(int argc, const char *argv[]) { 

std::regex regex_OK_1(regex_string_OK_1); 
std::regex regex_OK_2(regex_string_OK_2); 

std::regex regex_PROBLEM(regex_string_PROBLEM); // This line throws regex_error on Ubuntu 

    return 0; 
} 

我測試了所有的正則表達式字符串https://myregextester.com,他們的工作就好了。此外,在MacOS上使用clang編譯的代碼可以解析大量實際案例數據,而不會出現任何問題。但現在我必須在Linux/gcc系統上運行代碼。

+0

從我看到的所以,甚至gcc 4.9仍然是與正則表達式的越野車。也許,你需要得到一個更新的版本。 –

回答

2

我不得不徹底重新編輯這個答案,因爲我在http://melpon.org/wandbox/你的下鐺和各種版本的gcc代碼測試,我開始認爲GCC不承認\-爲連字符的有效逃生(實際上在所有版本) 。

你的例子似乎對我來說是正確的:[_\\-[:alnum:]]已經包含用於連字符的換碼:\\-但由於某些原因,gcc不喜歡它。因此,我建議以下字符類:

`[-_[:alnum:]]` 

,如果你還需要匹配斜線:\就應該添加\\\\(我以前認爲這是你的意圖)。

ps。我以前的答案留下\\,而另一方面造成叮噹例外,但這是不正確的正則表達式,因爲它結束在轉義括號:\[這是廢話 - 但爲什麼不在海灣合作委員會?

+0

我接受了這個答案,因爲這解決了gcc的問題。但是現在,代碼在MacOS(鏗鏘聲)上引發異常... – tnorgd

+0

@tnorgd查看我的編輯。你也可以在各種版本的gcc/clang下快速測試你的代碼:http://melpon.org/wandbox/permlink/lg9fG7E5Yu2KqMeK – marcinj