2016-06-08 1 views
2

와 I는 다음과 같이 여러 행 텍스트 기록을 분석하고하지 : C + +0 정규식은 그 소리와 함께 작동하지만 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을 던졌습니다. 여기에 최소 (비) - 작업 예이다 : 나는 https://myregextester.com 모든 정규식 문자열을 테스트

#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; 
} 

, 그들은 잘 작동합니다. 또한, clang으로 MacOS에서 컴파일 된 코드는 문제없이 많은 실제 사례 데이터를 구문 분석합니다. 하지만 이제 리눅스/gcc 시스템에서 코드를 실행해야합니다.

+0

내가 본 것에서 볼 때, gcc 4.9조차도 여전히 정규식으로 인해 버그가 있습니다. 아마, 당신은 아직 새로운 버전을 얻을 필요가있다. –

답변

2

http://melpon.org/wandbox/ 코드에서 다양한 버전의 코드를 http://melpon.org/wandbox/에서 테스트 했으므로 gcc가 \-을 실제로는 모든 버전에서 유효한 이스케이프로 인식하지 못한다고 생각하기 시작했습니다. .

귀하의 예가 지금 나에게 맞는 것 같습니다. [_\\-[:alnum:]]에는 이미 하이픈에 대한 이스케이프가 포함되어 있습니다 : \\- 그러나 gcc는 몇 가지 이유로 그것을 좋아하지 않습니다. 그래서 나는 다음과 같은 문자 클래스를 제안한다

`[-_[:alnum:]]` 

당신은 또한 일치해야하는 경우

는 슬래시 \은 다음 \\\\을 추가해야합니다 (I 당신의 의도였다 그 이전에 가정).

ps. 내 이전 대답 \\ 왼쪽 반면에 clang에 대한 예외가 발생했는데, 그것은 대괄호 이스케이프에서 끝나는대로 잘못된 regexp : \[ 그건 말도 안돼 -하지만 왜 안 gcc에?

+0

gcc의 문제가 해결 되었기 때문에 그 대답을 받아 들였습니다. 하지만 이제 코드가 MacOS (clang)에서 예외를 throw합니다. – tnorgd

+0

@tnorgd 내 편집을 참조하십시오. 또한 gcc/clang의 다양한 버전에서 코드를 테스트 할 수 있습니다. http://melpon.org/wandbox/permlink/lg9fG7E5Yu2KqMeK – marcinj

관련 문제