2016-05-17 6 views
0

私の正規表現が機能しなくなっています。私は文字列からURLをエクスポートしようとしています。文字列内にあるテキストの一部を取り出します。 pastebin.com/wA9N1Gbi。私はHistorik.exeで0x7638DAE8でエラー「未処理の例外次取得コンパイルする場合Imは使用しようとしていることを正規表現式は正規表現が有効になっていません

(?< protocol>https?:\/\/)(?:(?< urlroot>[^\/?#\n\s]+))?(?< urlResource>[^?#\n\s]+)?(?< queryString>\?(?:[^#\n\s]*))?(?:#(?< fragment>[^\n\s]))? 

Here'saリンクregex101.com/r/bH1eS9/3

、残念ながら機能していません:マイクロソフトC++例外:メモリ位置0x0018ED9Cのstd :: regex_error。 "。どのように私はそれを行うことができる別のアイデアを誰かが持っていますか?このタスクに適している別の正規表現関数がありますか?

この時点でコーディングしています。前もって感謝します。

string str; 
std::ifstream in("c:/Users/Petrus/Documents/History", std::ios::binary); 
std::stringstream buffer; 

buffer << in.rdbuf(); 

std::string contents(buffer.str()) 

unsigned counter = 0; 
std::regex word_regex(
    R"((?<protocol>https?:\/\/)(?:(?<urlroot>[^\/?#\n\s]+))?(?<urlResource>[^?#\n\s]+)?(?<queryString>\?(?:[^#\n\s]*))?(?:#(?<fragment>[^\n\s]))?)", 
    std::regex::extended 
    ); 
auto words_begin = std::sregex_iterator(contents.begin(), contents.end(), word_regex); 
auto words_end = std::sregex_iterator(); 

for (std::sregex_iterator i = words_begin; i != words_end; ++i) { 
    std::smatch match = *i; 
    std::string match_str = match.str(); 
    for (const auto& res : match) { 
     counter++; 
     std::cout << counter++ << ": " << res << std::endl; 
    } 
+0

それはまさにunfortunately._作業_Notだ方法について詳しく説明してください!それは非常に曖昧な質問です。 [MCVE]を提供する。 –

答えて

0

複雑な正規表現が必要ですか?それほど厳格ではないことができますか?

std::string load_file(const std::string& filename) 
{ 
    std::ostringstream oss; 
    if(auto ifs = std::ifstream(filename, std::ios::binary)) 
     oss << ifs.rdbuf(); 
    else 
     throw std::runtime_error("Failed to open file: " + filename); 
    return oss.str(); 
} 

int main(int, const char* const*) 
{ 
    std::string s = load_file("test.txt"); 

    // crude... but effective? 
    std::regex e(R"(https?:\/\/[^/]+[[:print:][:punct:]]*)"); 

    auto itr = std::sregex_iterator(s.begin(), s.end(), e); 
    auto end = std::sregex_iterator(); 

    unsigned counter = 0; 
    for(; itr != end; ++itr) 
     std::cout << ++counter << ": " << itr->str(0) << '\n'; 

} 

出力:

1: http://boplats.vaxjo.se/ 
2: http://192.168.0.7/ 
3: http://old.honeynet.org/ 
4: http://old.honeynet.org/scans/scan15/som/som11.txt 
5: http://en.hackdig.com/ 
6: http://parallelrecovery.com/pdf-password.html 
7: http://digitalcorpora.org/corp 
8: http://tv4play.se/program/nyhetsmorgon 
9: http://bredbandskollen.se/ 
10: http://194.47.149.19/dv1482/Lab5/ 
... 
+0

それはちょうど完璧です!私はそれを正しく見ている! –

+0

あなたはそれを釘付け!私はあなたに借りができた!多くの愛!ホモなし;) –

関連する問題