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

时间:2015-11-16 20:57:50

标签: c++ regex

我没有为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;
}

3 个答案:

答案 0 :(得分:2)

你需要添加另一个&#34; \&#34;在每个&#34;。&#34;之前。我认为应该解决它。您需要使用转义字符来表示&#34; \&#34;所以你的正则表达式看起来像这样

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

更新

正如@ user3494744也说你必须使用

std::regex_search 

而不是

std::regex_match. 

我测试了它现在有效。

答案 1 :(得分:2)

代码本身没有问题。你错误地将m.size()误认为匹配数,实际上,你的正则表达式返回的是 groups 的数量。

std::match_results::size reference无法理解:

  

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

有2组(因为你在2个选项中定义了一个捕获组),并且总共有1个匹配。

请参阅this IDEONE demo

#include <regex>
#include <string>
#include <iostream>
#include <time.h>
using namespace std;

int main()
{
    string data("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.");
    std::regex pattern("(dl\\.boxcloud\\.com|api-content\\.dropbox\\.com)");
    std::smatch result;

    while (regex_search(data, result, pattern)) {
        std::cout << "Match: " << result[0] << std::endl;
        std::cout << "Captured text 1: " << result[1] << std::endl;
        std::cout << "Size: " << result.size() << std::endl;
        data = result.suffix().str();
    }
}

输出:

Match: dl.boxcloud.com
Captured text 1: dl.boxcloud.com
Size: 2

请参阅,捕获的文本等于整个匹配。

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

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

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

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

答案 2 :(得分:1)

问题是您使用的是regex_match而不是regex_search。引用manual

请注意,regex_match只会将正则表达式与整个字符序列成功匹配,而std :: regex_search将成功匹配子序列

这个修补程序会给出一个匹配项,但是太多了,因为您必须将\.替换为\\.,如我的回答所示。否则字符串&#34; dl X boxcloud.com&#34;也会匹配。

相关问题