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) でコンパイルした場合に機能します。regex_errorただし、gcc でコンパイルすると、そのうちの 1 つがスローされます。最小限の(非)作業例を次に示します。

#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ですべての正規表現文字列をテストしましたが、問題なく動作します。また、clang を使用して MacOS でコンパイルされたコードは、多くの実際のケース データを問題なく解析します。しかし今、Linux/gcc システムでコードを実行する必要があります。

4

1 に答える 1

2

http://melpon.org/wandbox/でテストしたように、この回答を完全に再編集する必要がありました。さまざまなバージョンのclangおよびgccの下のコードで、gccが\-ハイフンの有効なエスケープとして認識しないと考え始めています(実際にはすべてのバージョンで)。

あなたの例は今私には正しいようです:[_\\-[:alnum:]]すでにハイフンのエスケープが含まれています:\\-しかし、いくつかの理由でgccはそれを好きではありません。したがって、次の文字クラスをお勧めします。

 `[-_[:alnum:]]`

スラッシュ : も一致させる必要がある場合\は、追加する必要があります\\\\(以前はそれがあなたの意図であると想定していました)。

ps。私の以前の回答は残り\\ましたが、一方でclangで例外を引き起こしましたが、ブラケットをエスケープすることで終わったため、それは正しくない正規表現でした:\[これはナンセンスでした-しかし、なぜgccではないのですか?

于 2016-06-08T15:45:30.067 に答える