1

次の文字列のすべての数字と一致させたい:

-0.237522264173E+01  0.110011117918E+01  0.563118085683E-01  0.540571836345E-01 -0.237680494785E+01  0.109394729137E+01 -0.237680494785E+01  0.109394729137E+01  0.392277532367E+02  0.478587433035E+02

ただし、何らかの理由で以下boost::regexが機能しません。

(.*)(-?\\d+\\.\\d+E\\+\\d+ *){10}(.*)

どうしたの?

編集:関連コードの投稿:

std::ifstream plik("chains/peak-summary.txt");
std::string mystr((std::istreambuf_iterator<char>(plik)), std::istreambuf_iterator<char>());
plik.close();
boost::cmatch what;
boost::regex expression("(.*)(-?\\d+\\.\\d+E\\+\\d+ *){10}(.*)");
std::cout << "String to match against: \"" << mystr << "\"" << std::endl;
if(regex_match(mystr.c_str(), what, expression)) 
{ 
  std::cout << "Match!";
  std::cout << std::endl << what[0] << std::endl << what[1] << std::endl;
} else {
  std::cout << "No match." << std::endl;
}

出力:

String to match against: " -0.237555275450E+01  0.109397523269E+01  0.560420828508E-01  0.556732715285E-01 -0.237472295761E+01  0.110192835331E+01 -0.237472295761E+01  0.110192835331E+01  0.393040553508E+02  0.478540190640E+02
"
No match.

また、ファイルの内容を文字列に投稿します。

[dare2be@schroedinger multinest-peak]$ cat chains/peak-summary.txt 
 -0.237555275450E+01  0.109397523269E+01  0.560420828508E-01  0.556732715285E-01 -0.237472295761E+01  0.110192835331E+01 -0.237472295761E+01  0.110192835331E+01  0.393040553508E+02  0.478540190640E+02
4

2 に答える 2

1

正規表現の(.*)周囲は一致し、文字列の最初と最後のすべてのテキストを消費するため、10を超える数字がある場合、最初の数字は一致しません。

また、負の指数を許可していません。

(-?\\d\\.\\d+E[+-]\\d+ *){10,}

動作するはずです。

これは、単一の文字列内のすべての数値と一致します。各番号を個別に照合する場合は、(-?\\d\\.\\d+E[+-]\\d+)繰り返し使用する必要があります。

于 2011-09-12T10:36:26.967 に答える
0

試してみてください:

(-?[0-9]+\\.[0-9]+E[+-][0-9]+)

あなた(.*)の最初の部分は貪欲な文字列全体と一致します。

于 2011-09-12T10:35:31.543 に答える