1

私は次のコードを持っています:

#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.comし、myemail@gmail.com取得yahoo.cしますgmail.

4

1 に答える 1

3

regex_match文字列を正確なパターンにチェックするために使用されます。

regex_search要件に応じてを使用するか、パターンですべての可能性をカバーする必要があります。正規表現を見てください

于 2013-01-02T09:18:31.097 に答える