【问题标题】:issues with my regex to detect urls in a string?我的正则表达式检测字符串中的 url 有问题吗?
【发布时间】:2010-12-23 13:26:47
【问题描述】:

大家好。 我正在使用以下正则表达式来检测字符串中的 url 并将它们包裹在 标签内

public static String detectUrls(String text) {

        String newText = text
                .replaceAll("(?:https?|ftps?|http?)://[\\w/%.-?&=]+",
                        "<a href='$0'>$0</a>").replaceAll(
                        "(www\\.)[\\w/%.-?&=]+", "<a href='http://$0'>$0</a>");
        return newText;
    }

我遇到以下链接未正确检测到的问题: 我不太擅长正则表达式,所以请指教。

http://code.google.com/p/shindig-dnd/

http://confluence.atlassian.com/display/GADGETDEV/Gadgets+and+JIRA+Portlets

www.liferay.com/web/raymond.auge/blog/

(www.opensocial.org/)

http://www.google.com

【问题讨论】:

标签: java regex url


【解决方案1】:

我正在使用这个:

private static final String URL_REGEX = 
   "http(s)?://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&amp;\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?";

Matcher matcher = URL_PATTERN.matcher(text);
text = matcher.replaceAll("<a href=\"$0\">$0</a>");
return text;

【讨论】:

  • 声明&amp;amp; 而不是&amp;amp; 就足够了,因为amp 已经在a-z; 的范围内被声明了两次。
  • 这种模式适用于大多数情况,但没有发现这种情况:(www.opensocial.org)
【解决方案2】:

您遇到的问题是您在字符组 ([]) 中使用 - 而不对其进行转义,该字符组用于定义范围 .-?(即字符 ./0123456789:;&lt;=&gt;?)。要么转义它\\-,要么把它放在字符类的末尾,这样它就不会完成一个范围。

public static String detectUrls(String text) {
    String newText = text
            .replaceAll("(?:https?|ftps?|http?)://[\\w/%.\\-?&=]+",
                    "<a href='$0'>$0</a>").replaceAll(
                    "(www\\.)[\\w/%.\\-?&=]+", "<a href='http://$0'>$0</a>");
    return newText;
}

【讨论】:

  • @marcog:实际上还有一种模式仍未被捕获:类似于 http://www.google.com
  • @sword http: 后面的空格是错字吗?
  • @marcog,是的,我的意思是添加它,因为没有空格,编辑器会将其转换为google.com,所以我添加它以跳过编辑器格式,你知道我想说什么吗?
  • @marcog,你有什么建议?
  • @sword 交换replaceAll() 调用并使用negative lookbehind。这是它的工作原理:http://ideone.com/Dj6ew 有一个小问题 - 它还在显示的 URL 前面添加了http://。这是正则表达式的一个限制,要解决这个问题,您必须在不使用正则表达式的情况下一次性解析文本。
【解决方案3】:

正如 marcog 所说,您应该转义 - 并匹配您给出的最后 2 个示例,您必须将 http 设为可选。 http? 也与 htt 匹配,这不是正确的协议。

所以正则表达式将是:

"(?:(?:https?|ftps?)://)?[\\w/%.?&=-]+"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    相关资源
    最近更新 更多