簡體   English   中英

如何將 regex_iterator 與 const char/wchar_t* 一起使用?

[英]How to use regex_iterator with const char/wchar_t*?

如何在const char*/wchar_t*的數據類型上使用regex_iterator

來自文檔:

使用 cregex_iterator = regex_iterator<const char*>;

使用 wcregex_iterator = regex_iterator<const wchar_t*>;

使用 sregex_iterator = regex_iteratorstring::const_iterator;

使用 wsregex_iterator = regex_iteratorwstring::const_iterator;

可重現的例子:

#include <string>
#include <iostream>
#include <regex>

template <typename T>
auto RegexMatchAll(const T* str, const T* regex)
{
    using iter = std::regex_iterator<T>;
    std::basic_regex<T> re(regex);
    auto words_begin = iter(str, (str + std::wcslen(str)), re); // <--- how to iterate according to the data in this case?
    auto words_end = iter();

    std::vector<std::match_results<iter>> result;

    for (iter i = words_begin; i != words_end; ++i) {
         std::match_results<iter> m = *i;
         result.emplace_back(m);
    }  

    return result; 
}

int main() {
     auto matches = RegexMatchAll(L"10,20,30", LR"((\d+))"); 
}

你有幾個錯誤。 假設您傳遞一個const char*const wchar_t*T將是charwchar_t ,所以:

  • std::regex_iterator需要一個迭代器類型, charwchar_t都不是。 您想改為傳遞它const T*
  • *i也會產生一個std::match_results<const T*> ,所以這是您應該存儲在result向量中的類型。
  • std::wcslen僅適用於T = wchar_t ,當T = char時需要使用std::strlen 我將創建一個重載的包裝器 function,它調用適當的標准庫 function。

把所有這些放在一起,這樣的事情應該可以工作:

std::size_t str_len(const char* s) { return std::strlen(s); }
std::size_t str_len(const wchar_t* s) { return std::wcslen(s); }

template <typename T>
auto RegexMatchAll(const T* str, const T* regex)
{
    using iter = std::regex_iterator<const T*>;
    std::basic_regex<T> re(regex);
    auto words_begin = iter(str, str + str_len(str), re);
    auto words_end = iter();

    return std::vector<std::match_results<const T*>>(words_begin, words_end);
}

演示


注意:我還簡化了std::vector構造以使用它的迭代器對構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM