Java替换字符串中的多个子字符串

时间:2015-03-24 10:41:55

标签: java regex

我有一个包含HTML的Java String变量,我希望用其他名称替换PNG图像的所有名称。

示例输入HTML

<html>
  <head>
    <link rel="stylesheet" media="screen" href="style.css"/>
  </head>
  <body>
    <img href="test1.png" />
    <img href="test2.png" />
  </body>
</html>

典型的输出HTML应为

<html>
  <head>
    <link rel="stylesheet" media="screen" href="style.css"/>
  </head>
  <body>
    <img href="C:\foo\bar\test1.png" />
    <img href="C:\foo\bar\test2.png" />
  </body>
</html>

目前,我有这个Java代码,它通过将图像作为资源加载来为我提供新名称。 但是我找不到好的正则表达式来选择所有(并且只有)图像名称(带扩展但没有引号),有人可以帮我吗?

Pattern imagePattern = Pattern.compile(" TODO ");
Matcher imageMatcher = imagePattern.matcher(taskHTML);

while (imageMatcher.find())
{
    String oldName = imageMatcher.group(1);
    String newName = "" + getClass().getResource("/images/" + imageMatcher.group(1));

    taskHTML.replace(oldName, newName);
}

匹配器应列出以下元素:

[test1.png, test2.png]

4 个答案:

答案 0 :(得分:1)

与其他人提到的一样,我建议你使用像JSoup这样的HTML解析器。

<强>用法:

import org.jsoup.nodes.*;
import org.jsoup.select.Elements;
import org.jsoup.Jsoup;

public class Parse {

    public static void main(String[] args) {
        String webPage = "<img href=\"test1.png\" /><img href=\"test2.png\" />"; //your HTML

        Document doc = Jsoup.parse(webPage);

        Elements imgLinks = doc.select("img[href]"); //grabs all imgLinks

        //for every <img> link
        for(Element link : imgLinks){           
            String imageName = link.attr("href"); //grab current href (your image name)
        link.attr("href", "C:\\foo\\bar\\" + imageName); //replace current href with the dir + imageName

        }
        System.out.println(doc.html()); //print modified HTML
    }
} 

<强>输出:

<html>
    <head>
        <link rel="stylesheet" media="screen" href="style.css">
    </head>
    <body>
        <img href="C:\foo\bar\test1.png"> 
        <img href="C:\foo\bar\test2.png">
    </body>
</html>

如果您有要解析的本地HTML文件,则需要将上面的doc替换为:

File in = new File(input);
Document doc = JSoup.parse(in, null);

或者,如果您想直接连接到某个页面,可以将其替换为:

Document doc = Jsoup.connect("http://stackoverflow.com/").get();

注意:您需要将JSoup添加到构建路径

答案 1 :(得分:0)

试试这个

str = str.replaceAll("href=\"(.*?)\"", "href=\"" + dir.replace("\\", "\\\\") + "$1\"");

答案 2 :(得分:0)

是否需要修改HTML内容,请考虑使用XSLT而不是REGEXP。

答案 3 :(得分:0)

我最终使用了以下正则表达式:

Pattern.compile("\\\"(.+\\.png)\\\"");

通过获取每个匹配的第二个元素(第一个是带引号的字符串)来访问引号之间的匹配:

matcher.group(1);