从字符串中过滤掉 url

Posted

技术标签:

【中文标题】从字符串中过滤掉 url【英文标题】:Filter out url from string 【发布时间】:2016-05-17 13:08:14 【问题描述】:

我试图从包含大量特殊字符、空格和 url 的字符串中过滤掉 url。我曾尝试使用正则表达式,但它失败了,它有时会设法排列 url,但输出仍然包含特殊字符和空格,所以我在这里。最好的问候P

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;

【问题讨论】:

根据数据文件的内容,您也许可以使用更简单的regex 几乎可以肯定,正则表达式是这里的最佳选择,但我们无法帮助您调试正则表达式,除非您能给出它不起作用的输入示例。 这是我尝试过滤的文件的开头。 url 链接在文件中。 pastebin.com/wA9N1Gbi 【参考方案1】:

简化(和调试)正则表达式的几个步骤:

    使用命名组(?&lt;groupname&gt;regex) 来帮助识别什么是什么并访问结果。 对于“仅分组”(),使用 (?:regex) 来“不记得”捕获,也有助于澄清发生了什么

完成后,只需对您的所有输入进行一些调整即可“修复”此正则表达式:

(?<protocol>https?:\/\/)(?:(?<urlroot>[^\/?#\n\s]+))?(?<urlResource>[^?#\n\s]+)?(?<queryString>\?(?:[^#\n\s]*))?(?:#(?<fragment>[^\n\s]))?
我将否定字符类更改为不匹配换行符或空格:[^#\n\s] 指定 urlRoot 之后的任何段都是可选的。 添加了字符串“https?”将结果限制为有效网址

regex demo 输出:

和匹配组(被截断但都在那里):

【讨论】:

你能给我一个使用`^\s*(?(?:[^:\/?#\n]+):)的代码示例吗?(?:\/ \/(?[^\/?#\n]*))?(?[^?#\n]*)(?\?(?:[^#\n] *))?(?:#(?.*))?$` 您是否查看了 pastebin.com/wA9N1Gbi 以了解我正在使用什么?最好的问候 Petrus,我用您的确切输入更新了我的演示。见regex101.com/r/bH1eS9/3 哦,我明白了!嗯,我很难使用你提供的正则表达式。我试图用你的代替我的,但不幸的是没有用。有什么想法吗? 很难说没有工作代码示例。您可以转到ideone.com 并使用字符串而不是文件创建一个工作示例? (免责声明:我是一个正则表达式的人,而不是一个 C++ 的人!) 哎呀!您从该站点提供给我的正则表达式似乎适用于 c++。你知道我应该在哪里找到合适的表达方式吗?

以上是关于从字符串中过滤掉 url的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 $lte 从 json 中过滤掉字符串值

如何从字符串中过滤掉特定字符串

如何使用正则表达式从字符串中删除以www。***开头的URL?

pig:过滤掉空字符串

过滤器与拦截器的区别

过滤器和拦截器的区别