【问题标题】:Android - how to detect urls in plain text using regex?Android - 如何使用正则表达式检测纯文本中的网址?
【发布时间】:2016-12-15 15:57:37
【问题描述】:

我正在尝试从纯文本中解析链接,我遇到了这个非常有用的网站:

http://blog.mattheworiordan.com/post/13174566389/url-regular-expression-for-links-with-or-without

有一个使用该正则表达式来匹配网址的示例,但是我在语法上遇到了一些麻烦。

Java 中 this 的等价物是什么:

$(function() {
  var urlRegEx = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-]*)?\??(?:[\-\+=&;%@\.\w]*)#?(?:[\.\!\/\\\w]*))?)/g;
  $('#target').html($('#source').html().replace(urlRegEx, "<a href='$1'>$1</a>"));
});

任何帮助或解决方案都将非常感激。

我知道 Java 中的 PatternMatcher 类,但我不知道 jquery 的 .html() 为实现解决方案做了什么。提前致谢。

【问题讨论】:

  • 如果需要替换,为什么要使用 Pattern 和 Matcher?使用String res = input_str.replaceAll(regex, "&lt;a href='$1'&gt;$1&lt;/a&gt;");。正则表达式是相同的,只需删除初始和最后一个/ 和双其他反斜杠([...] 中的那些反斜杠都可以删除,除了\w)。

标签: java android regex


【解决方案1】:

你不需要直接使用PatternMatcher如果需要替换匹配的字符串,使用String#replaceAll

String input_str = "http://www.some.site.com?and=value&s=more\nhttp://10.23.46.134\nemail@me.at.site.com";
String regex = "(([A-Za-z]{3,9}:(?://)?)(?:[-;:&=+$,\\w]+@)?[A-Za-z0-9.-]+|(?:www\\.|[-;:&=+$,\\w]+@)[A-Za-z0-9.-]+)((?:/[+~%/.\\w-]*)?\\??(?:[-+=&;%@.\\w]*)#?(?:[.!/\\\\\\w]*))?";
String res = input_str.replaceAll(regex, "<a href='$0'>$0</a>");
System.out.println(res);
// => 
//  <a href='http://www.some.site.com?and=value&s=more'>http://www.some.site.com?and=value&s=more</a>
//  <a href='http://10.23.46.134'>http://10.23.46.134</a>
//  <a href='email@me.at.site.com'>email@me.at.site.com</a>

正则表达式是相同的,只需使用g 修饰符和双其他反斜杠删除初始和最后一个/(并且[...] 中的那些反斜杠都可以删除,除了\w)。可以删除外部捕获组,因为您可以使用 $0 反向引用来访问替换模式中的整个匹配值。

查看regex demoJava demo

【讨论】:

  • 非常感谢,这真的很有用。我还试图避免在最终字符串中包含任何属性标签。这应该使用 URLSpan 来完成吗?
  • 你说你打算在纯文本上使用它。你是指什么样的属性标签?
  • 我只想突出显示链接本身并使其可点击,如下所示:jsbin.com/wotinulonu/edit?html,js,output 不包括周围的属性标签。右边的演示是我理想中想要实现的。
  • 什么是属性标签?请参阅this regex demo 以检查您的演示文本的结果(单击 Java 那里的绿色按钮)。
【解决方案2】:

您可以这样做(调整正则表达式以满足您的需要):

String originalString = "Please go to http://www.stackoverflow.com";
String newString = originalString.replaceAll("http://.+?(com|net|org)/{0,1}", "<a href=\"$0\">$0</a>");

【讨论】:

    猜你喜欢
    • 2012-02-08
    • 2014-04-02
    • 1970-01-01
    • 2012-03-15
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多