我有一些用空格分隔的文本。
喜欢的东西 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来获取捕获组。 有没有办法存档,我试图使用"?:"在捕获组,但可能我错过了一些东西。
答案 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"; }
如果您要解析令牌,请使用tokenizer
或regex_iterator
。
如果您的语法更复杂,请考虑使用Boost Spirit Qi。