Java正则表达式模式仅匹配字符串的最后一次出现

时间:2016-04-21 18:31:56

标签: java html regex

在html doc中,我需要用文件名替换文件的完整路径。 文档非常大,所以我认为我可以使用正则表达式来获得实用的解决方案。我已经阅读了类似的问题,并尝试了解决方案,但这只是没有用。

实施例。给出这个html输入。

<img src="app/javax.faces.resource/color_pan.png?ln=img/partidos" style="width:100%; height:30px;" class="centerImg"/>
<img src="/app/javax.faces.resource/pan.png?ln=img/partidos" class="centerImg"/>

我需要以下输出:

<img src="color_pan.png" style="width:100%; height:30px"; class="centerImg"/>
<img src="pan.png" class="centerImg"/>

我正在尝试这些模式:

Pattern p = Pattern.compile("src=\"(?=.*src).*/color_pan.png[^\"]*\"");
Patter p1 = Pattern.compile("src=\"(?!.*src).*/pan.png[^\"]*\"");

第一个适用于第一个图像,第二个适用于第二个(两者都在同一个html文档中)。 我需要一个适用于每个图像的通用模式。所以问题是只找到文件名左边的第一个“src”元素。换句话说,“src”必须是文件名前面的最后一个。 这样,我可以正确地替换字符串。 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

这个正则表达式似乎做了工作

解决方案1&lt; = 2匹配1509步

(^<img src=")(?:.*?)([\w.]+)(?=\?)[^"]*"(.*$)

Regex Demo

迈向有效的解决方案

解决方案2&lt; = 2个匹配593步

(^<img src=").*(?<=\/|")([\w.]+)(?=\?)[^"]*"(.*$)

Java代码

String pattern = "(^<img src=\")(?:.*?)([\\w.]+)(?=\\?)[^\"]*\"(.*$)";
Pattern r = Pattern.compile(pattern);

while (true) {
     String line = x.nextLine();
     Matcher m = r.matcher(line);
     if (m.find()) {
         System.out.println(m.group(1) + m.group(2) + m.group(3));
     } else {
         System.out.println("Not Found");
     }
}

<强> Ideone Demo