使用 C++ 打印给定数组中所有作为给定字符串子字符串出现的字符串


在编程世界中,有很多场景需要我们在更大的文本中查找特定模式。一个常见的任务是从给定数组中查找并打印所有作为给定字符串子字符串出现的字符串。这个看似基本的问题可以使用各种方法解决,在这篇文章中,我们将探讨其中两种方法。我们将对每种方法使用的语法和算法进行明确的解释,并附带两个完整的可执行代码示例。

语法

在我们深入探讨方法之前,让我们首先了解我们将用来解决这个问题的语法。

void printMatchingStrings(string array[], string text);

算法

为了解决查找并打印数组中所有作为给定字符串子字符串出现的字符串的问题,我们可以遵循以下分步算法:

  • 初始化一个空向量来存储匹配的字符串。

  • 重复遍历数组中的每个字符串。

  • 检查当前字符串是否是给定文本的子字符串。

  • 如果是,则将字符串添加到匹配字符串的向量中。

  • 遍历所有字符串后,打印匹配字符串的向量。

方法 1:使用 string.find() 函数

在此方法中,我们将使用 string.find() 函数,该函数返回子字符串在字符串中的位置。如果找不到子字符串,则返回一个特殊值,称为 string::npos。

示例

#include <iostream>
#include <vector>
#include <string>

void printMatchingStrings(const std::string array[], const std::string& text, int arraySize) {
   std::vector<std::string> matchingStrings;

   for (int i = 0; i < arraySize; i++) {
      if (text.find(array[i]) != std::string::npos) {
         matchingStrings.push_back(array[i]);
      }
   }

   for (const std::string& match : matchingStrings) {
      std::cout << match << std::endl;
   }
}

int main() {
   const std::string array[] = { "apple", "banana", "orange", "pear" };
   const std::string text = "I like to eat bananas and oranges.";

   int arraySize = sizeof(array) / sizeof(array[0]);

   printMatchingStrings(array, text, arraySize);

   return 0;
}

输出

banana
orange

方法 2:使用正则表达式

正则表达式提供了一个强大的工具来进行字符串模式匹配。我们也可以利用它们来解决我们的问题。

示例

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

void printMatchingStrings(const std::string array[], const std::string& text, int arraySize) {
   std::vector<std::string> matchingStrings;

   for (int i = 0; i < arraySize; i++) {
      std::regex pattern(array[i]);

      if (std::regex_search(text, pattern)) {
         matchingStrings.push_back(array[i]);
      }
   }

   for (const std::string& match : matchingStrings) {
      std::cout << match << std::endl;
   }
}

int main() {
   const std::string array[] = { "apple", "banana", "orange", "pear" };
   const std::string text = "I like to eat bananas and pear.";

   int arraySize = sizeof(array) / sizeof(array[0]);

   printMatchingStrings(array, text, arraySize);

   return 0;
}

输出

banana
pear

选择正确的方法

两种方法的选择取决于特定问题的需求:

如果使用 string.find() 方法:

要匹配的模式相对简单。

性能是一个问题,因为对于简单的模式,string.find() 方法可能比正则表达式更快。

您更喜欢更简单的实现,无需正则表达式语法。

如果使用正则表达式方法:

要匹配的模式很复杂,需要高级模式匹配功能。

模式匹配的灵活性和强大功能非常重要。

性能不是关键因素,或者模式的复杂性证明了使用正则表达式的合理性。

结论

在本文中,我们探讨了两种独特的方法来解决查找并打印数组中所有作为给定字符串子字符串出现的字符串的问题。主要方法使用了 string.find() 函数,这是一个简单直接的解决方案。后续方法利用正则表达式的强大功能来处理更复杂的模式匹配情况。根据特定问题的需求,您可以选择最合适的方法。请记住,模式匹配是编程中的一项基本任务,对各种方法和策略有扎实的理解可以显著提高您的问题解决能力。因此,下次遇到类似问题时,您将掌握有效处理它的知识。

更新于:2023年7月25日

浏览量:126

开启您的职业生涯

完成课程获得认证

开始学习
广告