21xrx.com
2024-12-26 14:44:16 Thursday
登录
文章检索 我的文章 写文章
如何在C++中提取字符串中的固定形式子串?
2023-06-26 17:24:45 深夜i     --     --
C++ 字符串 提取 固定形式 子串

在C++编程中,提取字符串中的固定形式子串是非常常见的需求。例如,当我们需要从一个字符串中提取出所有的邮箱地址,或者从一个URL链接中提取出域名部分时,就需要快速、精准地获取目标子串。

下面介绍几种常见的C++提取固定形式子串的方法:

1. 利用string类的find和substr方法实现

find函数用于从左到右查找指定的子串,可以返回该子串在原字符串中的位置,如果没有找到,则返回string::npos。substr函数则用于从字符串中截取子串,可以指定子串的起始位置和长度。

下面给出一个示例代码,用于从一个字符串中提取所有的邮箱地址:


#include <iostream>

#include <string>

using namespace std;

int main()

{

  string str = "Email1: abc@example.com, Email2: def@foo.com, Email 3: ghi@bar.cn";

  string pattern = "@";

  size_t pos = str.find(pattern);

  while (pos != string::npos) {

    size_t left = str.find_last_of(' ', pos);

    size_t right = str.find_first_of(' ', pos);

    string email = str.substr(left + 1, right - left - 1);

    cout << email << endl;

    pos = str.find(pattern, pos + 1);

  }

  return 0;

}

在上面的代码中,我们首先定义了原字符串str和目标子串pattern,然后使用find函数从左到右查找pattern在str中的位置。如果找到了,则利用find_last_of和find_first_of方法获取邮件地址的左右边界,并使用substr方法截取子串。最后,通过循环查找的方式,将字符串中所有的符合要求的子串提取出来并进行输出。

2. 利用正则表达式实现

另一个常见的方法就是使用正则表达式。C++11引入了regex库,可以很方便地实现对字符串的匹配与查找。

下面给出一个示例代码,用于从一个字符串中提取所有的域名:


#include <iostream>

#include <string>

#include <regex>

using namespace std;

int main()

{

  string str = "http://www.example.com/index.html, https://news.foo.cn/article/123";

  regex pattern("(http|https)://([\\w\\.]+)(/\\w*)*");

  smatch result;

  while (regex_search(str, result, pattern)) {

    cout << result[2] << endl;

    str = result.suffix().str();

  }

  return 0;

}

在上面的代码中,我们定义了一个正则表达式模式,用于匹配以http或https开头,后面跟着域名和路径的URL链接。使用regex_search函数进行查找时,会返回正则表达式中匹配的结果result,其中result[2]表示匹配到的第二个子串,也就是域名部分。通过循环可以将字符串中所有符合要求的子串逐个提取出来并进行输出。

总的来说,C++提取字符串中固定形式子串的方法有很多,可以根据具体情况选择合适的方法。对于较为简单的情况,使用string类的相关方法即可完成;对于较为复杂的情况,可以采用正则表达式库。无论使用哪种方法,都需要注意代码的健壮性和可读性,以实现高效、优美的代码编写。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复