我正在学习regex和C++,我想做一个后缀表达式。为了做到这一点,我想像这样分开我的字符串:
String : 56*((6+2)/(8-7)* 2^3)
List : 56 | * | ( | (| 6 | + | 2 | ) | / | ( ....
实际上我有:
void Stack::findIT() {
std::string var = "56*((6+2)/(8-7)* 2^3)";
std::string str("56*((6+2)/(8-7)* 2^3)");
std::regex r("([0-9]*|[+*\\-\\/%]|[()])");
std::smatch m;
std::regex_search(str, m, r);
for(auto v: m) std::cout << v << std::endl;
}
我想药丸a: std::stack _operators;std::stack _operands;
要做到这一点,用Regex提取字符串,但是为什么当我使用这段代码时,我有空字符串?
发布于 2018-01-18 13:02:02
对于std::regex r("([0-9]*|[+*\\-\\/%]|[()])");
,空字符串是匹配的。
你可能想:"[0-9]+|[+*/%^()-]"
您还必须迭代搜索:
std::string str("56*((6+2)/(8-7)* 2^3)");
std::regex r("[0-9]+|[+*/%^()-]");
std::smatch m;
while (std::regex_search(str, m, r)) {
std::cout << m[0] << std::endl;
str = m.suffix();
}
发布于 2018-01-18 13:11:24
要收集字符串中的所有匹配,您应该真正使用std::sregex_iterator
。
我建议您使用原始字符串文本,这样您就不必担心在regex:R"~()~"
中转义(表达式位于中间,不需要转义)。
我稍微改变了你。在字符集中,您必须将-
放在开头或结尾(否则它是一个范围分隔符)。我还增加了阅读十进制数的能力。
std::string str("56*((6+2)/(8-7)* 2^3)");
std::regex r(R"~(\d+(:?\.\d+)?|[-+*\/%^]|[()])~");
std::sregex_iterator m_end;
std::sregex_iterator m(std::begin(str), std::end(str), r);
for(; m != m_end; ++m)
std::cout << m->str() << std::endl;
https://stackoverflow.com/questions/48321406
复制相似问题