我对正则表达式有点不好,所以如果有人能告诉我正确的正则表达式能够捕获这种格式的三个元素,我将不胜感激。
<element1>[<element2>="<element3>"]
如果需要,我可以使用boost。此字符串中的分隔符为'[', '=', ']', '"'
和' '
。
更新:这是我到现在为止所尝试的内容 -
int main(void) {
std::string subject("foo[bar=\"baz\"]");
try {
std::regex re("([a-zA-Z]+)[([a-zA-Z])=");
std::sregex_iterator next(subject.begin(), subject.end(), re);
std::sregex_iterator end;
while (next != end) {
std::smatch match = *next;
std::cout << match.str() << std::endl;
next++;
}
} catch (std::regex_error& e) {
std::cout << "Error!" << std::endl;
}
}
虽然这给了我 -
foo[
bar
baz
由于
答案 0 :(得分:2)
你不需要迭代器,你可以将它与一个表达式匹配,捕获组(<capture>)
返回子匹配,如下所示:
// Note: Raw string literal R"~()~" removes the need to escape the string
std::regex const e{R"~(([^[]+)\[([^=]+)="([^"]+)"\])~"};
// ^ 1 ^ ^ 2 ^ ^ 3 ^
// | | | | |_____|------- sub_match #3
// | | | |
// | | |_____|---------------- sub_match #2
// | |
// |_____|------------------------- sub_match #1
std::string s(R"~(foo[bar="baz"])~"); // Raw string literal again
std::smatch m;
if(std::regex_match(s, m, e))
{
std::cout << m[1] << '\n'; // sub_match #1
std::cout << m[2] << '\n'; // sub_match #2
std::cout << m[3] << '\n'; // sub_match #3
}
答案 1 :(得分:1)
您可以使用\[<\[" \]?(\[^<>\[\]" =\x0a\x0d\]+)\[>\[" \]?
获取元素:
#include <string>
#include <sstream>
#include <vector>
#include <iterator>
#include <regex>
#include <iostream>
#include <iomanip>
auto input_text{
R"(foo[bar="baz"]
<element1>[<element2>="<element3>"])"};
auto fromString(std::string str) {
std::vector<std::string> elements;
std::regex r{R"([<\[" ]?([^<>\[\]" =\x0a\x0d]+)[>\[" ]?)"};
std::istringstream iss(str);
auto it = std::sregex_iterator(str.begin(), str.end(), r);
auto end = std::sregex_iterator();
for(; it != end; ++it) {
auto match = *it;
auto element = match[1].str();
elements.push_back(element);
}
return elements;
}
int main()
{
auto result = fromString(input_text);
for (auto t : result) {
std::cout << t << '\n';
}
return 0;
}
输出:
foo
bar
baz
element1
element2
element3