从std :: smatch读取字符串时获取垃圾

时间:2018-07-25 16:47:57

标签: c++ regex string memory cout

我想,我想修复内存问题已有几个小时了,但我无法理解该问题。

我有一个类StaticTagExtendsTag,它们是根据std::smatch<regex>)的结果创建的。创建方法StaticTag始终有效,而创建方法ExtendsTag则永远无效。唯一的区别是正则表达式始终有效,因为子字符串已匹配。这里的问题甚至是打印一个捕获的组,大多数情况下一直给我一个带有正确字符串后缀的垃圾。这是代码。

执行两种方法find_static_tagfind_extends_tag(后者不起作用):

StaticTag static_tag;
if (Regex::find_static_tag(this->_content, static_tag)) {

}

ExtendsTag extends_tag;
if (Regex::find_extends_tag(this->_content, extends_tag)) {

}

下面介绍了两种方法:

bool Regex::find_extends_tag(std::string in, ExtendsTag& tag) {
    std::string pattern = "\\{%\\s*extends\\s+\"(\\S+)\"\\s*%\\}";
    std::smatch match;
    if (Regex::find_first(pattern, in, match)) {
        std::cout << match[1] << std::endl;
        tag = ExtendsTag(match[1], match.position(), match.length());
        return true;
    }

    return false;
}

bool Regex::find_static_tag(std::string in, StaticTag& tag) {
    std::string pattern = "\\{%\\s*static\\s+\"(\\S+)\"\\s*%\\}";
    std::smatch match;
    if (Regex::find_first(pattern, in, match)) {
        std::cout << match[1] << std::endl;
        tag = StaticTag(match[1], match.position(), match.length());
        return true;
    }

    return false;
}

它们需要匹配:{% static "style.css" %}{% extends "master.html" %}

通常我得到的是这样的东西,而不是“ master.html”:�0e.html。

我认为这可能是内存问题,但是我不知道从哪里开始,因为两种方法对我来说看起来是相同的。它与创建StaticTagExtendsTag的对象无关,它无法通过match[1]方法打印find_extends_tag

编辑:在第二种方法中将static更改为extends时,结果是一样的。那么<regex>出问题了吗?

谢谢您的帮助!

我要解析的文件:

{% extends "master.html" %}

{% block content %}
    <p>Hello ios/index.html</p>
    <img src="{% static "html-css.png" %}"/>
{% endblock %}

编辑2: 不知道为什么它开始工作。我取出了Regex::find_first(pattern, in, match)的实现,并将其直接放在find_static_tagfind_extends_tag中,它开始正常工作。

以下是find_extends_tag的实现,该实现始终有效:

bool Regex::find_extends_tag(std::string in, ExtendsTag& tag) {
    std::smatch match;
    if (std::regex_search(in, match, std::regex("\\{%\\s*extends\\s+\"(\\S+)\"\\s*%\\}"))) {
        tag = ExtendsTag(match[1], match.position(), match.length());
        return true;
    }
    return false;
}

不确定这里有什么区别。

0 个答案:

没有答案