[英]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
將是char
或wchar_t
,所以:
std::regex_iterator
需要一個迭代器類型, char
和wchar_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.