重复捕获组忽略空格

时间:2015-10-28 13:25:47

标签: regex c++11 boost

我有一些用空格分隔的文本。

喜欢的东西 123 10.03.1 TEXT1 TEXT2 TEXT3 TEXT4 TEXT5 TEXT6 2015/10/10 2012。

我能够得到所有不是" TEXT1 TEXT2 TEXT3 TEXT4 TEXT5 TEXT6"我想重复该文本的捕获组:

TEXT1   TEXT2  TEXT3    TEXT4 TEXT5 TEXT6

我想重复捕获组,比如。

(\s*\w)*

但我想忽略空白 有没有办法忽略正则表达式上的空格?

我将使用boost :: regex_search来获取捕获组。 有没有办法存档,我试图使用"?:"在捕获组,但可能我错过了一些东西。

2 个答案:

答案 0 :(得分:5)

我强烈怀疑你想要能解析语法的东西;这是Boost Spirit X3:

<强> Live On Coliru

 #panel{
    width:100vw;
    height:100vh;
  }

打印

#include <boost/spirit/home/x3.hpp>
#include <boost/tuple/tuple_io.hpp>
#include <boost/fusion/adapted/boost_tuple.hpp>
#include <iostream>

namespace std {
    // hack for debug output
    std::ostream& operator<<(std::ostream& os, std::vector<std::string> const& v) {
        for (auto i = 0ul; i<v.size(); ++i) {
            if (i) os << " ";
            os << v[i];
        }
        return os;
    }
}

namespace x3 = boost::spirit::x3;

int main() {
    std::string const input = "123 10.03.1    TEXT1   TEXT2   TEXT3      TEXT4  TEXT5 \t   \tTEXT6 2015/10/10 \t  2012";

    int num;
    std::string version;
    std::vector<std::string> texts;
    std::string date;
    int year;

    auto attr = boost::tie(num, version, texts, date, year);
    bool ok = false;

    {
        using namespace x3;

        auto date_    = raw [ repeat(4) [ digit ] >> '/' >> repeat(2) [ digit ] >> '/' >> repeat(2) [ digit ] ];
        auto version_ = lexeme [ +char_("0-9.") ];
        auto text_    = lexeme [ alpha >> *alnum ];

        ok = phrase_parse(input.begin(), input.end(),
                int_ >> version_ >> *text_ >> date_ >> int_ /* >> eoi */,
                x3::space,
                attr);
    }

    if (ok) {
        std::cout << "parsed: " << attr << "\n";
    } else {
        std::cout << "parse failed\n";
    }
}

请注意这不仅仅是分割您的输入。它忽略了需要的空格,将转换后的值分配给整数,将parsed: (123 10.03.1 TEXT1 TEXT2 TEXT3 TEXT4 TEXT5 TEXT6 2015/10/10 2012) 元素放在向量中等。

如果您愿意,也可以从流中解析这些内容(请参阅TEXTn)。

答案 1 :(得分:2)

目前还不清楚你真正想要的是什么。你想要什么“捕获”(你将如何阅读价值以及你期望它是什么?)。

正如现在所描述的那样,您可以使用.*捕获所有内容。

如果您真的想忽略空格,请使用正则表达式替换\s+以替换为" "

  

更新示例:

     

Live on Coliru

#include <boost/regex.hpp>
#include <iostream>

int main() {
    std::string input = "TEXT1    TEXT2    TEXT3  TEXT4  TEXT5    TEXT6";

    std::cout << input << "\n";
    input = boost::regex_replace(input, boost::regex("\\s+"), " ");

    std::cout << input << "\n";

}

如果您要解析令牌,请使用tokenizerregex_iterator

如果您的语法更复杂,请考虑使用Boost Spirit Qi。