我正在使用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 :(得分:1)
用
<a href=\"[^\"]+\">[^<]+</a>
这是不可能的,因为[^\"]+
会匹配任何字符,而不是"
您可以尝试以下正则表达式
<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格式,正确的方法是使用像JSoup这样的HTML解析器解析它并获取所有链接然后将模式应用于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