使用正则表达式添加到堆栈

Add to a stack with a regex

本文关键字:堆栈 添加 正则表达式      更新时间:2023-10-16

我正在学习正则表达式和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;