2016-05-17 13 views
0

私は、多くの特殊文字、空白、およびURLを含む文字列からURLをフィルタリングしようとしています。私は正規表現を使用しようとしましたが、それは失敗します、それは時々URLを整列するのを管理しますが、出力にはまだ特殊文字と空白が含まれています。敬具 文字列からURLをフィルタリングする

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

if (!in.is_open()){ 
    cout << "Failed to open" << endl; 
} 
else{ 
    cout << "Opened OK" << endl; 
} 

buffer << in.rdbuf(); 

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

std::ofstream out("urls.txt"); 

unsigned counter = 0; 
std::regex word_regex(
    R"(^(([^:\/?#]+):)?(//([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?)", 
    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; 
    } 
    std::cout << " " << match_str << '\n'; 
} 

system("PAUSE"); 

return 0; 

P

}

+0

をあなたは逃げることができるかもしれませんデータファイルの内容に応じてより単純な 'regex'を使用します。 – Galik

+0

正規表現はほとんど確実にここに行く方法ですが、それがうまくいかない入力の例を挙げることができない限り、正規表現のデバッグを手助けすることはできません。 –

+0

フィルタリングしようとしているファイルの先頭です。 URLのリンクはファイル内にあります。 http://pastebin.com/wA9N1Gbi –

答えて

1

いくつかの手順を簡素化するため(およびデバッグ)正規表現:

  1. 使用という名前のグループ(?<groupname>regex)何とアクセス結果を何に識別するのに役立ちます。 ()年代を「唯一のグループ化」の
  2. 、また、キャプチャを 『覚えていない』ために(?:regex)を使用するには、一度に行わ

に何が起こっているのか、単にいくつかの調整 『修正』をすべてご入力のため、この正規表現を明確にするのに役立ちます。

(?<protocol>https?:\/\/)(?:(?<urlroot>[^\/?#\n\s]+))?(?<urlResource>[^?#\n\s]+)?(?<queryString>\?(?:[^#\n\s]*))?(?:#(?<fragment>[^\n\s]))? 
  • Iは、改行や空白が一致しないように否定文字クラスを変更:[^#\n\s]
  • はurlRoot後の任意のセグメントがオプションであることを指定しました。
  • に「https?」という文字列が追加されました。

    enter image description here

    と(切り捨てしかし、そこにすべての)試合グループ:有効なURLへ

regex demo出力結果を制限するために

enter image description here

+0

「^ \ s *」(?:(?:[^:\ /?#\ n] +):)を使用したコード例を教えてください。 (? [^ \ /?#\ n] *))?(? [^?#\ n] *)(? \ :#(?。*))?$ $ pastebin.com/wA9N1Gbiを見て、私は何の仕事をしていますか?お問い合わせ –

+0

Petrus、私はあなたの正確な入力で私のデモを更新しました。 https://regex101.com/r/bH1eS9/3を参照してください。 – sweaver2112

+0

ありがとうございます!まあ私は提供した正規表現を使用するのが難しいです。私は私の代わりにあなたの仕事を不運にしてみました。何か案は? –