Java正则表达式替换大型String中的多个文件路径

时间:2012-12-07 17:01:32

标签: java regex string parsing html-parsing

所以一个正则表达式专业人士我不是,我正在寻找一个很好的方法来做到这一点。我有一个包含可变数字<img>标签的大字符串。我需要将所有这些图像的路径更改为images/。大字符串还包含其他东西,而不仅仅是这些img的。

<img src='http://server.com/stuff1/img1.jpg' />
<img src='http://server.com/stuff2/img2.png' />

用我能做的ReplaceAll()替换服务器名称,它是中间的可变路径我对如何包含无能为力。它不一定需要是一个正则表达式,但循环遍历整个字符串似乎很浪费。

3 个答案:

答案 0 :(得分:2)

Apache Commons Lang提供API来进行各种替换:

String dirName = "images";
StringUtils.replace(html, "http://server.com/stuff1/", dirName + "/");

答案 1 :(得分:2)

以下内容可用于替换从server.com链接到jpg的所有<img>标记:

s.replaceAll("<img src='http://server.com[^']*/([^']*)' />", "<img src='images/$1' />");

如果您在src属性周围使用双引号:

s.replaceAll("<img src=\"http://server.com[^\"]*/([^\"]*)\" />", "<img src=\"images/$1\" />");

这是有效的,因为[^']*/将匹配尽可能多的不是单引号的字符,然后是文字'/',因此它将使用整个路径。如果所有<img>代码都来自server.com,您可以删除http://server.com,正则表达式的工作方式相同。

请注意,如果您事先知道需要更换所有图片代码,或者您的字符串只包含<img>代码,则可以进一步缩短此范围,例如您可以使用以下内容替换所有src属性中的路径:

s.replaceAll("src='[^']*/([^']*)'", "src='images/$1'");

如果这个字符串替换的次数超出了你想要的范围,只需添加你想要匹配的更多文字字符串。

答案 2 :(得分:0)

使用Java String方法replaceAll(regex, replacement)

其中

String regex = "(http://server\\.com/)[^<]+(/[^<]+)";

String directory = "images";
String replacement = "$1" + directory + "$2";

这将转为

http://server.com/stuff1/img1.jpg

http://server.com/images/img1.jpg

例如:

String content = "<img src=\"http://server.com/stuff1/img1.jpg\"><img src=\"http://server.com/stuff1/img2.jpg\"><img src=\"http://server.com/stuff1/img3.jpg\">"
String regex = "(http://server\\.com/).+(/img1\\.jpg)";
String directory = "images";
String replacement = "$1" + directory + "$2";
content = content.replaceAll(regex, replacement);
System.out.println(content);

将输出:

<img src="http://server.com/images/img1.jpg"><img src="http://server.com/images/img2.jpg"><img src="http://server.com/images/img3.jpg">

如果您想跳过完整的主机名并使用相对路径更改replacement进入:

String replacement = directory + "$2";

这将转为

http://server.com/stuff1/img1.jpg

images/img1.jpg