📜  如何在c ++中知道字符串中某个子字符串的数量(1)

📅  最后修改于: 2023-12-03 15:24:27.138000             🧑  作者: Mango

如何在C++中知道字符串中某个子字符串的数量

在C++中,要知道一个字符串中某个子字符串的数量,我们可以使用标准库中的string类提供的函数来实现。

find()函数

find()函数用于查找某个子字符串在原字符串中第一次出现的位置。它的声明如下:

size_t find(const string& str, size_t pos = 0) const noexcept;

其中,str是要查找的子字符串,pos是在原字符串中搜索的起始位置,默认从字符串开头开始搜索。

调用该函数可以得到子字符串在原字符串中的位置,如果没有找到则返回string::npos,即-1。我们可以通过反复调用该函数来依次查找子字符串出现的所有位置,直到返回string::npos为止。

#include <iostream>
#include <string>

using namespace std;

int countSubstring(string str, string subStr) {
    int count = 0, pos = 0;
    while ((pos = str.find(subStr, pos)) != string::npos) {
        ++count;
        pos += subStr.size();
    }
    return count;
}

int main() {
    string str = "hello world, world hello";
    string subStr = "world";
    int count = countSubstring(str, subStr);
    cout << "The substring \"" << subStr << "\" appears " << count << " times in the string \"" << str << "\"." << endl;
    return 0;
}

上面的代码中,countSubstring()函数用于计数子字符串出现的次数。它在原字符串中从左到右依次查找子字符串,每次查找到一个位置后,调整查找起始位置为当前位置加上子字符串长度,以避免重复计数。

输出结果为:

The substring "world" appears 2 times in the string "hello world, world hello".
regex类

除了使用find()函数,我们还可以使用正则表达式库中的regex类来实现,其优点是可以支持更复杂的模式匹配。

regex类的使用需要引入头文件<regex>,声明如下:

class regex {
public:
    regex() noexcept;
    regex(const char* pattern, flag_type flags = ECMAScript) { /* ... */ }
    regex(const string& pattern, flag_type flags = ECMAScript) { /* ... */ }
    regex(const regex&) noexcept;
    regex(regex&&) noexcept;
    regex& operator=(const regex&) noexcept;
    regex& operator=(regex&&) noexcept;
    ~regex();
    // ...
};

其中,pattern是正则表达式模式,flags是正则表达式的一些选项。

regex类中的regex_match()函数可以用于判断一个字符串是否匹配某个正则表达式。regex类中的regex_search()函数可以用于在字符串中查找某个正则表达式的匹配项。这两个函数的返回值是一个bool类型的值,表示是否匹配或查找到。

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

using namespace std;

int countSubstring(string str, string subStr) {
    regex r(subStr);
    int count = 0;
    for (sregex_iterator it(str.begin(), str.end(), r), end; it != end; ++it) {
        ++count;
    }
    return count;
}

int main() {
    string str = "hello world, world hello";
    string subStr = "world";
    int count = countSubstring(str, subStr);
    cout << "The substring \"" << subStr << "\" appears " << count << " times in the string \"" << str << "\"." << endl;
    return 0;
}

上面的代码中,regex类用于保存子字符串的正则表达式模式,sregex_iterator类用于在指定的字符串中搜索与正则表达式模式匹配的字符串子序列。

输出结果与上面相同:

The substring "world" appears 2 times in the string "hello world, world hello".
总结

本文介绍了在C++中知道一个字符串中某个子字符串的数量的两种方法:使用标准库中的string类提供的find()函数,以及使用正则表达式库中的regex类进行模式匹配。在实际开发中,我们应该根据具体需求选择不同的方法。