-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只是内容中的一篇文章和几个链接。

4

1 回答 1

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 片段,因此正确的方法是使用 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
于 2013-10-14T11:33:54.847 回答