c++0x 正则表达式适用于 clang 但不适用于 gcc 4.9.2
c++0x regex works with clang but not with 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 系统上的代码。
我不得不完全重新编辑这个答案,因为我在 http://melpon.org/wandbox/ 各种版本的 clang 和 gcc 下测试了你的代码,我开始认为 gcc 不承认 \-
作为一个有效的连字符转义(实际上在所有版本中)。
你的例子现在对我来说似乎是正确的:[_\-[:alnum:]]
已经包含连字符的转义符:\-
但由于某些原因 gcc 不喜欢它。所以我建议以下字符 class:
`[-_[:alnum:]]`
如果您还需要匹配斜杠:\
那么您应该添加 \\
(我之前假设这是您的意图)。
ps。我之前的回答留下了 \
,这在另一方面导致了 clang 的异常,但这是不正确的正则表达式,因为它以转义括号结尾:\[
这是胡说八道 - 但为什么不在 gcc 上?
我正在解析如下所示的多行文本记录:
> 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 系统上的代码。
我不得不完全重新编辑这个答案,因为我在 http://melpon.org/wandbox/ 各种版本的 clang 和 gcc 下测试了你的代码,我开始认为 gcc 不承认 \-
作为一个有效的连字符转义(实际上在所有版本中)。
你的例子现在对我来说似乎是正确的:[_\-[:alnum:]]
已经包含连字符的转义符:\-
但由于某些原因 gcc 不喜欢它。所以我建议以下字符 class:
`[-_[:alnum:]]`
如果您还需要匹配斜杠:\
那么您应该添加 \\
(我之前假设这是您的意图)。
ps。我之前的回答留下了 \
,这在另一方面导致了 clang 的异常,但这是不正确的正则表达式,因为它以转义括号结尾:\[
这是胡说八道 - 但为什么不在 gcc 上?