有没有任何方法可以从C++中的文本中提取URL

Is there any way to extract URL from text in C++

本文关键字:文本 提取 URL C++ 任何 方法 有没有      更新时间:2023-10-16

在PHP中,我可以编写正则表达式从文本中提取URL。想知道C++中有这样的类或方法吗?

我正在处理流数据,其中可能包含URL。我想从中提取每个具有计数值的URL。

我可以使用向量或其他数据结构进行后期处理,但问题在于标题。

C++11引入<regex>作为标准库的一部分。

让我们来看看如何使用它。

首先,我们需要导入标头。

#include <regex>

现在让我们声明我们的URL正则表达式。现在我们将使用一些非常简单的东西。我将让您用一个更完整的正则表达式来替换它。注意我们是如何使用\而不仅仅是来逃避事物的。本身是C++中的一个特殊字符,因此我们需要对其进行转义

std::regex url(".*\..*");

让我们创建一个字符串来对此进行测试。

std::string url_test = "example.com";

现在,让我们检查url_test是否与url匹配,并相应地打印出一条消息。

if(regex_match(url_test, url)) {
  std::cout << "It's a url!" << std::endl;
} else {
  std::cout << "Oh snap! It's not a url!" << std::endl;
}

我们的完整程序:

#include <iostream>
#include <regex>
#include <string>
int main()
{
  std::regex url(".*\..*");
  std::string url_test = "example.com";
  if(regex_match(url_test, url)) {
    std::cout << "It's a url!" << std::endl;
  } else {
    std::cout << "Oh snap! It's not a url!" << std::endl;
  }
}

更多信息,请访问http://www.cplusplus.com/reference/regex/

关于正则表达式,我使用以下内容来匹配大量链接:

b(?:(?:(?:https?|ftp|file)://|www.|ftp.)[-A-Z0-9+&@#/%?=~_|$!:,.;]*[-A-Z0-9+&@#/%=~_|$]
   | ((?:mailto:)?[A-Z0-9._%+-]+@[A-Z0-9._%-]+.[A-Z]{2,4})b)
|"(?:(?:https?|ftp|file)://|www.|ftp.)[^"rn]+"?
|'(?:(?:https?|ftp|file)://|www.|ftp.)[^'rn]+'

这允许匹配开头有和没有http/https的web链接、开头有和不有mailto的电子邮件链接、ftp链接和文件链接,以及单引号或双引号内的链接。

我还没有使用C++(<regex>)的regex功能,但今天我们将看一看,并带回一些代码示例。