我有一个带有一些实数的字符串。
char buf1 [256] ="> m电流辐照度[mW / cm2] = 9.1 \ r \ n&#34 ;; // 范围 0.0~999.9
实数范围介于0.0和999.9之间。没有负面价值。
我写了如下的示例代码。我为此使用了正则表达式。
" \ S \ d * \ d \ S"
无论如何,此刻我得到了正确的结果。不过,我也期待从网站下面得到更好的表达。
http://www.regular-expressions.info/floatingpoint.html
我为此尝试过很多东西。例如,
[ - +]([0-9] * [0-9] + |。[0-9] +)?
我找不到实数。我只是想知道我的原始表达是否是最好的。
代码段:
#define CATCH_CONFIG_MAIN
#include "catch.hpp"
#include <iostream>
#include <vector>
#include <string>
#include <boost\algorithm\string.hpp>
#include <boost/algorithm/string/regex.hpp>
using namespace std;
using namespace boost::algorithm;
TEST_CASE("string parsing", "[STRING]"){
typedef std::vector<string>::iterator intStr;
typedef std::vector<double>::iterator dubIter;
char buf1[256] = ">m Current Irradiance [mW/cm2] = 9.1 \r\n"; // Range 0.0 ~ 999.9
char buf2[256] = ">m Current Irradiance [mW/cm2] = 90.1 \r\n"; // Range 0.0 ~ 999.9
char buf3[256] = ">m Current Irradiance [mW/cm2] = 990.1 \r\n"; // Range 0.0 ~ 999.9
std::vector<string> strVec;
strVec.push_back(buf1);
strVec.push_back(buf2);
strVec.push_back(buf3);
std::vector<double> dubVec;
dubVec.push_back(9.1);
dubVec.push_back(90.1);
dubVec.push_back(990.1);
try{
for (std::pair<intStr, dubIter> i(strVec.begin(), dubVec.begin()); i.first != strVec.end(); ++i.first, ++i.second)
{
boost::iterator_range<std::string::iterator> r = find_regex((*i.first), boost::regex{ "\\s\\d*.\\d\\s" });
std::string ret(r.begin(), r.end());
{
CHECK((*i.second) == std::stod(ret));
}
}
}
catch (const std::invalid_argument& ia){
std::cerr << "Invalid argument: " << ia.what() << '\n';
}
}
//$ testAny.exe
//== == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == =
//All tests passed(3 assertions in 1 test case)
答案 0 :(得分:1)
您在网站上看到的那个:
"[+-]?(\\d*\\.\\d+\|\\d+)"
也会匹配单个数字,这可能是您想要的,也可能不是。在您的示例中,它们将匹配cm2中的2。如果你真的想只匹配带小数点的数字,那么只需删除或者大小写:
"[+-]?\\d*\\.\\d+"
答案 1 :(得分:1)
你需要逃避“。”在你的正则表达式。
"\s\d*.\d\s"
至少应该是:
"\s\d*\.\d\s"
否则为“。”将匹配任何角色。