【问题标题】:Find URL in String在字符串中查找 URL
【发布时间】:2012-04-02 00:32:45
【问题描述】:

您好,我想在字符串中查找 URL,我使用正则表达式创建了许多关于此的主题,但我遇到了问题。使用这种模式:

String regex = "\\b(((ht|f)tp(s?)\\:\\/\\/|~\\/|\\/)|www.)" + 
            "(\\w+:\\w+@)?(([-\\w]+\\.)+(com|org|net|gov" + 
            "|mil|biz|info|mobi|name|aero|jobs|museum" + 
            "|travel|[a-z]{2}))(:[\\d]{1,5})?" + 
            "(((\\/([-\\w~!$+|.,=]|%[a-f\\d]{2})+)+|\\/)+|\\?|#)?" + 
            "((\\?([-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?" +
            "([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)" + 
            "(&(?:[-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?" + 
            "([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)*)*" + 
            "(#([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)?\\b";

它在大多数页面中都运行良好,但我在其他页面上存在问题。例如:

http://hello.com/hello world

返回

http://hello.com/hello

问题在于空间。

谁有一个很好的模式来解决这个问题?

谢谢。

编辑:: 这是我的代码

private ArrayList<String> pullLinks(String text) {
    ArrayList<String> links = new ArrayList<String>();

    String regex = "\\b(((ht|f)tp(s?)\\:\\/\\/|~\\/|\\/)|www.)" + 
            "(\\w+:\\w+@)?(([-\\w]+\\.)+(com|org|net|gov" + 
            "|mil|biz|info|mobi|name|aero|jobs|museum" + 
            "|travel|[a-z]{2}))(:[\\d]{1,5})?" + 
            "(((\\/([-\\w~!$+|.,=]|%[a-f\\d]{2})+)+|\\/)+|\\?|#)?" + 
            "((\\?([-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?" +
            "([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)" + 
            "(&(?:[-\\w~!$+|.,*:]|%[a-f\\d{2}])+=?" + 
            "([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)*)*" + 
            "(#([-\\w~!$+|.,*:=]|%[a-f\\d]{2})*)?\\b";

    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(text);
    while(m.find()) {
    String urlStr = m.group();
    if (urlStr.startsWith("(") && urlStr.endsWith(")"))
    {
    urlStr = urlStr.substring(1, urlStr.length() - 1);
    }
    links.add(urlStr);
    }
    return links;
    }  

【问题讨论】:

标签: java regex string url


【解决方案1】:

网址中不允许有空格(它们需要替换为%20)。例如看这个问题的答案:

如果您仍然允许 URL 包含空格,那么您将如何解释例如 http://www.google.com/ig is a nice webpage?显然/ig之后的部分不应该包含在内!

【讨论】:

  • 所以没有办法检测带有 %20 的网址?
  • 当然有。你已经做的表达。以%[a-f\\d]{2} 为例(表示% 后跟{2}a-f 范围内的字符或数字)。
  • 这对我不起作用。用我的代码编辑问题。谢谢
  • 然后将以下内容添加到您的表达式中:regex = "(" + regex + ").*?\\.jpg" 到您的正则表达式中。
【解决方案2】:

空格不是有效的 URL 字符。

另外,如果您不使用空格作为终止符,您将如何找到 URL 的结尾?

您的正则表达式也未能考虑其他顶级域(如 .int)。我实际上并不确定它为什么要寻找特定的 TLD,因为它们不需要形成有效的 URL。

【讨论】:

  • 对我来说,使用 .int 或其他文件失败不是问题。我的网址永远是:something.es/some some.jpg
猜你喜欢
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 2014-06-28
  • 1970-01-01
  • 2011-01-11
  • 2011-07-13
相关资源
最近更新 更多