C++ 需要帮助构建正则表达式模式吗

C++ 需要帮助构建正则表达式模式吗,c++,regex,C++,Regex,我无法为stl regex_match函数创建模式,需要一些帮助来理解为什么我创建的模式不起作用,以及如何修复它。 我认为正则表达式会在dl.boxcloud.com上大受欢迎,但事实并非如此 ****仍在寻找输入。我更新了计划,以反映建议。我认为应该有两场比赛 #include <string> #include <regex> using namespace std; wstring GetBody(); int _tmain(int argc, _TCHAR* a

我无法为stl regex_match函数创建模式,需要一些帮助来理解为什么我创建的模式不起作用,以及如何修复它。 我认为正则表达式会在dl.boxcloud.com上大受欢迎,但事实并非如此

****仍在寻找输入。我更新了计划,以反映建议。我认为应该有两场比赛

#include <string>
#include <regex>
using namespace std;

wstring GetBody();
int _tmain(int argc, _TCHAR* argv[])
{
    wsmatch m;
    wstring regex(L"(dl\\.boxcloud\\.com|api-content\\.dropbox\\.com)");
    regex_search(GetBody(), m, wregex(regex));
    printf("%d matches.\n", m.size());

    return 0;
}
wstring GetBody() {
    wstring body(L"ABOUTLinkedIn\r\n\r\nwall of textdl.boxcloud.com/this/file/bitbyte.zip sent you a message.\r\n\r\nDate: 12/04/2012\r\n\r\nSubject: RE: Reference Ask\r\n\r\nOn 12/03/12 2:02 PM, wall of text wrote:\r\n--------------------\r\nRuba,\r\n\r\nI am looking for a n.");
    return body;
}
#包括
#包括
使用名称空间std;
wstring GetBody();
int _tmain(int argc,_TCHAR*argv[]
{
WSM;
wstring regex(L“(dl\\.boxcloud\\.com | api content\\.dropbox\.com)”;
正则表达式搜索(GetBody(),m,wregex(regex));
printf(“%d个匹配项。\n”,m.size());
返回0;
}
wstring GetBody(){
wstring body(L“ABOUTLinkedIn\r\n\r\nwall of textdl.boxcloud.com/this/file/bitbyte.zip)向您发送了一条消息。\r\n\r\n日期:2012年4月12日\r\n\r\n对象:RE:Reference Ask\r\n\r\n在2012年3月12日下午2:02时,文本墙写道:\r\n--------------------------------------\r\nRuba\r\n\r\n\r\n我正在寻找一个“.”;
返回体;
}
您需要在每个“”之前添加另一个“\”。我想这应该能解决问题。您需要使用转义字符来表示“\”,因此您的正则表达式如下所示

wstring regex(L"(dl\\.boxcloud\\.com|api-content\\.dropbox\\.com)");
更新:

As@user3494744还说你必须使用

std::regex_search 
而不是

std::regex_match. 
我测试过了,现在可以用了

您需要在每个“”之前添加另一个“\”。我想这应该能解决问题。您需要使用转义字符来表示“\”,因此您的正则表达式如下所示

wstring regex(L"(dl\\.boxcloud\\.com|api-content\\.dropbox\\.com)");
更新:

As@user3494744还说你必须使用

std::regex_search 
而不是

std::regex_match. 

我测试过了,现在可以用了

问题是您使用
regex\u匹配
而不是
regex\u搜索
。引自:

请注意,正则表达式匹配将仅成功地将正则表达式匹配到整个字符序列,而std::regex_搜索将成功地匹配子序列


此修复程序将提供匹配,但太多,因为您还必须将
\.
替换为
\.
,如我的回答之前所示。否则字符串“dlXboxcloud.com”也将匹配。

问题是您使用了
regex\u-match
而不是
regex\u-search
。引自:

请注意,正则表达式匹配将仅成功地将正则表达式匹配到整个字符序列,而std::regex_搜索将成功地匹配子序列


此修复程序将提供匹配,但太多,因为您还必须将
\.
替换为
\.
,如我的回答之前所示。否则字符串“dlXboxcloud.com”也将匹配。

代码本身没有问题。在匹配的数量上,您错误地使用了
m.size()
,而实际上,您的正则表达式返回的是许多组

对于理解以下内容没有帮助:

返回match_results对象中的匹配数和子匹配数

共有2个组(因为您围绕2个备选方案定义了一个捕获组)和1个“全部匹配”

看,捕获的文本等于整个匹配

要“修复”此问题,您可以使用非捕获组,或完全删除分组:

std::regex pattern("(?:dl\\.boxcloud\\.com|api-content\\.dropbox\\.com)");
// or
std::regex pattern("dl\\.boxcloud\\.com|api-content\\.dropbox\\.com");

也可考虑在声明正则表达式时使用原始字符串文字(以避免反斜杠地狱):


代码本身没有问题。在匹配的数量上,您错误地使用了
m.size()
,而实际上,您的正则表达式返回的是许多组

对于理解以下内容没有帮助:

返回match_results对象中的匹配数和子匹配数

共有2个组(因为您围绕2个备选方案定义了一个捕获组)和1个“全部匹配”

看,捕获的文本等于整个匹配

要“修复”此问题,您可以使用非捕获组,或完全删除分组:

std::regex pattern("(?:dl\\.boxcloud\\.com|api-content\\.dropbox\\.com)");
// or
std::regex pattern("dl\\.boxcloud\\.com|api-content\\.dropbox\\.com");

也可考虑在声明正则表达式时使用原始字符串文字(以避免反斜杠地狱):


尝试不同的分组:
(dl\.boxcloud\.com)|(api content\.dropbox\.com)
我很确定会检查您的字符串是否与您的模式完全匹配。尝试使用Instedi只是粘贴了“尝试不同分组”的建议,替换了我的建议并运行了该程序。不匹配尝试不同的分组:
(dl\.boxcloud\.com)|(api content\.dropbox\.com)
我很确定会检查您的字符串是否与您的模式完全匹配。尝试使用Instedi只是粘贴了“尝试不同分组”的建议,替换了我的建议并运行了该程序。没有匹配项是正确的。为了澄清,在编译器处理转义字符后,字符串中的
\.
将成为单个
。您需要避开实际的反斜杠。或者,您可以使用来表示正则表达式,这样就不需要转义字符了。不匹配,对。为了澄清,在编译器处理转义字符后,字符串中的
\.
将成为单个
。您需要避开实际的反斜杠。或者,您可以使用来表示正则表达式,这样就不需要转义字符了。没有匹配项。我只是尝试了正则表达式搜索,但仍然没有匹配项。你能指出我做错了什么吗?int_tmain(int argc,_TCHAR*argv[]){wsmatch m;wstring regex(L“(dl\\.boxcloud\\.com | api content\\.dropbox\\.com)”;regex_search(GetBody(),m,wregex(regex));for(auto x:m)printf(“匹配%S\n”,x);返回0;}用双反斜杠转义每个句点,命中次数太多。我认为,因为它看到太多,这不是一个匹配,因为有一个假阳性。在查看匹配结果时,存在匹配结果的垃圾文本。例子:ﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮ?