2013-10-14 147 views
-1

我正在使用java。我有一个文本,在这个文本中有几个链接。其中一些链接到特定的网站,这些链接不会改变。其余的不是,我想通过链接替换这些链接。 我曾经replaceAll()法:替换文本中的特定链接

String input = "my text"; 
String regex = "<a href=\"[^\"]+\">[^<]+</a>"; 
String output = input.replaceAll(regex, "<a href=\"myweb.com\">my web</a>"); 

但它取代了我的文字的各个环节,我不知道怎么问,它只是取代了一些链接。 我该如何做我的目的?谢谢 更新: input只是一篇文章中的内容和很少的联系。

+0

你的正则表达式是不知道什么应该由'myweb.com'更换所以你必须将它添加到它。 – A4L

+0

给我们一个正确的输入文字在你的问题 – SSP

+0

应该有一些东西在你不想要替换的URL中是常见的 – SSP

回答

1

随着

<a href=\"[^\"]+\">[^<]+</a> 

这是不可能的,因为[^\"]+将匹配任何charachter这不是一个"

你可以试试下面的正则表达式

<a href=\".*(foo\\.com|bar\\.org).*\">[^<]+</a> 

有了这个样本文字

static String input = "my text\r\n" + 
     "Foo foo foo\r\n" + 
     "<a href=\"foo.com\">Foo site</a>\r\n" + 
     "Bar bar bar\r\n" + 
     "<a href=\"bar.org\">Bar site</a>\r\n" + 
     "bla bla bla\r\n" + 
     "\r\n" + 
     ""; 

这里是一个小测试:

@Test 
public void replaceLinks() { 
    String regex = "<a href=\".*(foo\\.com|bar\\.org).*\">[^<]+</a>"; 
    String output = input.replaceAll(regex, "<a href=\"myweb.com\">my web</a>"); 
    System.out.println(output); 
} 

输出是:

my text 
Foo foo foo 
<a href="myweb.com">my web</a> 
Bar bar bar 
<a href="myweb.com">my web</a> 
bla bla bla 

然而,由于您的输入似乎是一个HTML fragement的正确方法是用HTML解析它解析器,如JSoup,并获取所有链接,然后将模式应用于href属性。如果匹配,则通过将新链接设置到元素中进行替换。

完成后写入片段bak。

@Test 
public void replaceLinksJSoup() { 
    Document doc = Jsoup.parse(input); 
    Elements links = doc.getElementsByTag("a"); 
    Pattern pattern = Pattern.compile(".*(foo\\.com|bar\\.org).*"); 
    for (Element link : links) { 
     String linkHref = link.attr("href"); 
     if (pattern.matcher(linkHref).matches()) { 
      link.attr("href", "myweb.com"); 
      link.text("my web"); 
     } 
    } 
    System.out.println(doc.body().html()); 
} 

输出:

my text Foo foo foo 
<a href="myweb.com">my web</a> Bar bar bar 
<a href="myweb.com">my web</a> bla bla bla