如何使用正则表达式C ++查找实数

时间:2015-08-04 08:13:31

标签: c++ regex boost

我有一个带有一些实数的字符串。

  

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)

2 个答案:

答案 0 :(得分:1)

您在网站上看到的那个:

"[+-]?(\\d*\\.\\d+\|\\d+)"

也会匹配单个数字,这可能是您想要的,也可能不是。在您的示例中,它们将匹配cm2中的2。如果你真的想只匹配带小数点的数字,那么只需删除或者大小写:

"[+-]?\\d*\\.\\d+"

答案 1 :(得分:1)

你需要逃避“。”在你的正则表达式。

"\s\d*.\d\s"

至少应该是:

"\s\d*\.\d\s"

否则为“。”将匹配任何角色。