在 C++ 中使用 regex_iterator 的确切方法是啥?

Posted

技术标签:

【中文标题】在 C++ 中使用 regex_iterator 的确切方法是啥?【英文标题】:What is the exact way of using regex_iterator in C++?在 C++ 中使用 regex_iterator 的确切方法是什么? 【发布时间】:2015-05-26 13:39:11 【问题描述】:

我一直在寻找一种计算字符串中特定类型的子字符串数量的好方法,例如,我想计算字符串“smstyuismsms”中“sms”的出现次数。我在一个有人建议使用 regex_iterator 的论坛中找到了答案。但是,当我尝试如下:

string in = "smstyuismssms";
cout << distance(regex_iterator(in.begin(), in.end(), regex("sms")),regex_iterator()) << "\n";

它会抛出一个错误提示

错误:在 '(' 标记之前缺少模板参数

那么,如果不是这样,那么使用正则表达式模板的正确方法是什么?请提供一些例子。

【问题讨论】:

【参考方案1】:

通过查看documentation,似乎 std::regex_iterator 是存在四个实例化的模板:

cregex_iterator    regex_iterator<const char*>
wcregex_iterator   regex_iterator<const wchar_t*>
sregex_iterator    regex_iterator<std::string::const_iterator>
wsregex_iterator   regex_iterator<std::wstring::const_iterator>

您应该改用这些。我的意思是,你总是可以自己传递模板参数,但这太冗长了。

来自 cppreference 示例:

auto words_begin = std::sregex_iterator(s.begin(), s.end(), words_regex);

这很像std::string/std::wstring,它们都是std::basic_string 模板的实例化。基本上你的代码相当于使用 basic_string 而不是直接使用 string/wstring 而不是传递模板参数。

【讨论】:

嗨!我首先仅使用相同的示例进行了尝试。但是 sregex_iterator 抛出了一个错误“未定义的正则表达式引用”。当我搜索这个问题时,我发现我正在使用的编译器(gcc4.8.1)可能不支持这个实例化。所以,然后,我切换到 regex_iterator。 @timidgeek See this question,恐怕你的编译器可能太旧了。 很好。我将更新我的编译器并询问是否仍然存在任何问题。谢谢。

以上是关于在 C++ 中使用 regex_iterator 的确切方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式

正则表达式

在 C++ 中使用 C# 接口或在 C# 中使用 C++ 接口

C++ 如何在 C++ 中使用 dlopen()?

如何在 Visual C++ 2010 中使用 C++ 库 [重复]

我们啥时候需要在纯 C++ 程序中使用结构?纯 C++ 程序是不是需要结构? [复制]