2016-05-17 3 views
0

Im пытается отфильтровать URL-адреса из строки, содержащей множество специальных символов, пробелов и URL-адресов. Я пытался использовать регулярное выражение, но он терпит неудачу, ему иногда удается выровнять URL-адрес, но на выходе все еще содержатся специальные символы и пустое пространство, поэтому я здесь. С наилучшими пожеланиями PОтфильтровать 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; 

}

+0

Вы можете быть в состоянии уйти с более простым 'regex' в зависимости от содержимого файла данных. – Galik

+0

Регулярное выражение почти наверняка будет здесь, но мы не сможем помочь вам отлаживать регулярное выражение, если вы не можете привести примеры входов, на которых он не работал. –

+0

Вот начало файла im try filter from. Ссылки на 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]))? 
  • Я изменил отрицается классы полукокса, чтобы не соответствовать новой строки или пробелы: [^#\n\s]
  • указано, что любой отрезок после UrlRoot является необязательным.
  • добавил строку "https?" ограничить результаты действительных адресов

regex demo выход:

enter image description here

и группы матча (усеченный, но все есть):

enter image description here

+0

Не могли бы вы предоставить код примера использования '^ \ s * (? (?: [^: \ /? # \ n] +):)? (?: \/\/(? [^ \ /? # \ N] *))? (? [^? # \ N] *) (? \? (?: [^ # \ N] *))? (? : # (? . *))? $ ' Вы посмотрели на pastebin.com/wA9N1Gbi, чтобы увидеть, с чем работает im? С наилучшими пожеланиями –

+0

Petrus, я обновил демо с вашим точным вводом. см. https://regex101.com/r/bH1eS9/3 – sweaver2112

+0

О, я вижу! Ну, у меня возникли трудности с использованием выражения регулярного выражения, которое было предоставлено. Я попытался заменить мою вашу, но не работает неудачно. Есть идеи? –

Смежные вопросы