我正在学习正则表达式和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;
}
我想药丸:标准::堆栈_operators;标准::堆栈_operands;
为此,请使用正则表达式提取字符串但是为什么当我使用此代码时,我有空字符串?
与 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();
}
演示
要收集字符串中的所有匹配项,您应该真正使用 std::sregex_iterator
.
我建议您使用原始字符串文字,这样您就不必担心在正则表达式中转义: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;