VC ++正则表达式匹配长字符串

时间:2013-01-02 09:04:22

标签: c++ regex

我有以下代码:

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

int main()
{
    std::tr1::regex rx("(\\w+)(\\.|_)?(\\w*)@(\\w+)(\\.(\\w+))+");
    std::string s;
    std::getline(std::cin,s);
    if(regex_match(s.begin(),s.end(),rx))
    {
        std::cout << "Matched!" << std::endl;
    }
}

如果正则表达式类似于"myemail@domain.com"但是如果我尝试"myemail@domain.com:anothermail@domain.com:useless string:blah blah",那么效果很好 它失败!

我可以做些什么来匹配有效字符串(最终打印出找到的字符串,只有匹配的部分不是所有字符串)?

我以某种方式取得了成功,但是对于一些REGEX模式,它失败了:

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

int main () {
    std::string str("mymail@yahoo.com;lslsls;myemail@gmail.com");
    std::tr1::regex rx("[a-zA-Z0-9_\\.]+@([a-zA-Z0-9\\-]+\\.)+[a-zA-Z]{2,4}");
    std::tr1::sregex_iterator first(str.begin(), str.end(), rx);
    std::tr1::sregex_iterator last;

    for (auto it = first; it != last; ++it) 
    {
        std::cout << "[Email] => " << it->str(1) << std::endl;
    }

    return 0;
}

此处获取mymail@yahoo.commyemail@gmail.com我得到yahoo.cgmail.

1 个答案:

答案 0 :(得分:3)

regex_match用于将字符串检查为精确模式。

您可以使用regex_search,具体取决于您的要求,或者您的模式必须涵盖所有可能性。 看看Regex