c++ - 从 sub_match<const char * >' to ' const char *const &' 转换

标签 c++ regex c++11

我正在尝试将 std::match_results 数据映射到我的 std::multimap 变量。这是代码:

#include "Precompiled.h"

using namespace std;
using namespace tdd;

auto main() -> int
{
    auto filename = LR"(E:\stats.stats)";

    auto file = invalid_handle
    {
        CreateFile(
            filename,
            GENERIC_READ,
            FILE_SHARE_READ,
            nullptr,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            nullptr
        )
    };

    if (!file)
    {
        TRACE(L"CreateFile failed %d\n", GetLastError());
        return 0;
    }

    auto size = LARGE_INTEGER{};

    if (!GetFileSizeEx(file.get(), &size))
    {
        TRACE(L"GetFileSizeEx failed %d\n", GetLastError());
        return 0;
    }

    if (size.QuadPart == 0)
    {
        TRACE(L"File is empty\n");
        return 0;
    }

    auto map = null_handle
    {
        CreateFileMapping(file.get(),
        nullptr,
        PAGE_READONLY,
        0, 0,
        nullptr)
    };

    if (!map)
    {
        TRACE(L"CreateFileMapping failed %d\n", GetLastError());
        return 0;
    }

    auto view = unique_ptr<char, map_view_deleter>
    {
        static_cast<char *>(MapViewOfFile(map.get(),
        FILE_MAP_READ,
        0,0,
        0))
    };

    if (!view)
    {
        TRACE(L"MapViewOfFile failed %d\n", GetLastError());
        return 0;
    }

    auto r = regex{ "type:([IPB])\\sdur:(\\d{1})\\scpbdur:(\\d{1})\\sq:(\\d+\\.\\d+)\\saq:(\\d+\\.\\d+)\\stex:(\\d+)\\smv:(\\d+)\\smisc:(\\d+)\\simb:(\\d+)\\spmb:(\\d+)\\ssmb:(\\d+)" };

    auto begin = view.get();
    auto end = begin + size.QuadPart;

    auto logValues = multimap<char, double>{};

    auto i = cregex_iterator{ begin, end, r };

    int d = 0;

    for (i; i != cregex_iterator{}; ++i, ++d)
    {
        logValues.emplace((*i)[1], (*i)[4]);
    }

    TRACE(L"%d\n", d);

    return 0;
}

我收到以下错误:

cannot convert argument 1 from 'const std::sub_match' to 'const char *const &'

我试过 static_cast 但它不起作用。我是否需要将转换运算符写入 std::sub_match 以将第一个值转换为 char 还是我遗漏了什么?

此外,在我的第二个 for 循环中,我想遍历 i,它是 std::cregex 迭代器,因为它在填充数据时已经递增,我如何重置它以再次遍历它?还是自动完成?我在文档中找不到这个问题的答案。

最佳答案

您尚未完成对匹配项的取消引用。 (*i)[1]返回 const sub_match<BidirectionalIterator> &对象(开始/结束迭代器的类型代替 BidirectionalIterator )。此 sub_match 对象包含一对迭代器,它们引用该匹配项的源字符串中的第一个字符和最后一个字符。

要获得该值的字符,您需要执行类似 *(*i)[1].first 的操作.

对于您所展示的内容,您不需要第一个循环来计算匹配项的数量。如果您的实际代码更复杂,并且您确实需要运行两次循环,请在运行第一个循环之前复制迭代器。

关于c++ - 从 sub_match<const char * >' to ' const char *const &' 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43017859/

相关文章:

c++ - 如何将 std::vector<std::string> 作为 char** 传递?

c++ - 静态库实现

c++ - tink_core Future (haxe) 形式 c++

c++ - 非静态方法指针的返回值推导

c++ - 如何在 C++ 运行时修改方法?

c++ - Boost c++ 库 interval_map 是否支持删除?

c++ - & 在构造函数中使用 const

javascript - 在 JavaScript 中,如果我将句子拆分成数组然后连接它,如何保留句子中的空格?

java - 使用 Java-Regex 将文本与 Regex 成对分割成几行

mysql - MySQL正则表达式为逗号分隔的文本