【问题标题】:c++0x regex works with clang but not with gcc 4.9.2c++0x 正则表达式适用于 clang 但不适用于 gcc 4.9.2
【发布时间】:2016-06-08 15:25:36
【问题描述】:

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

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

【问题讨论】:

  • 从我在 SO 上看到的情况来看,即使 gcc 4.9 仍然存在正则表达式问题。也许,您需要获得更新的版本。

标签: regex c++11 gcc4.9


【解决方案1】:

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

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

 `[-_[:alnum:]]`

如果您还需要匹配斜线:\,那么您应该添加\\\\(我之前假设这是您的意图)。

ps。我之前的回答留下了\\,另一方面,它在clang上引起了异常,但这是不正确的正则表达式,因为它以转义括号结尾:\[ 这是无稽之谈-但为什么不在gcc上?

【讨论】:

  • 我接受了这个答案,因为它解决了 gcc 的问题。但是现在代码在 MacOS (clang) 上抛出异常...
  • @tnorgd 查看我的编辑。您也可以在这里在各种版本的 gcc/clang 下快速测试您的代码:melpon.org/wandbox/permlink/lg9fG7E5Yu2KqMeK
猜你喜欢
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多