我想在以下字符串中匹配每个单个数字:
-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
答案 0 :(得分:1)
正则表达式周围的(.*)
匹配并使用字符串开头和结尾的所有文本,因此如果有超过十个数字,则第一个不会匹配。
另外,你不允许使用否定指数。
(-?\\d\\.\\d+E[+-]\\d+ *){10,}
应该有用。
这将匹配单个字符串中的所有数字;如果你想分别匹配每个数字,你必须迭代地使用(-?\\d\\.\\d+E[+-]\\d+)
。
答案 1 :(得分:0)
尝试:
(-?[0-9]+\\.[0-9]+E[+-][0-9]+)
开头的(.*)
与贪婪的整个字符串匹配。