c ++ 0x regex适用于clang但不适用于gcc 4.9.2

时间:2016-06-08 15:25:36

标签: regex c++11 gcc4.9

我正在解析如下所示的多行文本记录:

> 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系统上运行代码。

1 个答案:

答案 0 :(得分:2)

我必须完全重复这个答案,因为我在各种版本的clang和gcc下测试http://melpon.org/wandbox/你的代码,我开始认为gcc不会将\-识别为有效的转义连字符(实际上在所有版本中)。

您的示例现在对我来说似乎正确:[_\\-[:alnum:]]已经包含了连字符的转义:\\-但由于某些原因,gcc不喜欢它。所以我建议遵循角色类:

 `[-_[:alnum:]]`

如果你还需要匹配斜杠:\那么你应该添加\\\\(我之前认为这是你的意图)。

PS。我之前的回答是\\,另一方面导致了铿锵的异常,但这是不正确的正则表达式,因为它以转义括号结束:\[这是无稽之谈 - 但为什么不在gcc上?