首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >添加到带有正则表达式的堆栈中。

添加到带有正则表达式的堆栈中。
EN

Stack Overflow用户
提问于 2018-01-18 12:29:41
回答 2查看 63关注 0票数 2

我正在学习regex和C++,我想做一个后缀表达式。为了做到这一点,我想像这样分开我的字符串:

代码语言:javascript
运行
复制
String : 56*((6+2)/(8-7)* 2^3)
List : 56 | * | ( | (| 6 | + | 2 | ) | / | ( ....

实际上我有:

代码语言:javascript
运行
复制
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提取字符串,但是为什么当我使用这段代码时,我有空字符串?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-18 13:02:02

对于std::regex r("([0-9]*|[+*\\-\\/%]|[()])");,空字符串是匹配的。

你可能想:"[0-9]+|[+*/%^()-]"

您还必须迭代搜索:

代码语言:javascript
运行
复制
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();
}

演示

票数 1
EN

Stack Overflow用户

发布于 2018-01-18 13:11:24

要收集字符串中的所有匹配,您应该真正使用std::sregex_iterator

我建议您使用原始字符串文本,这样您就不必担心在regex:R"~()~"中转义(表达式位于中间,不需要转义)。

我稍微改变了你。在字符集中,您必须将-放在开头或结尾(否则它是一个范围分隔符)。我还增加了阅读十进制数的能力。

代码语言:javascript
运行
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48321406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档