Java 正则表达式替换了大字符串中的多个文件路径



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

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

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

以下内容

应该可用于替换从 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'");

只需添加更多要匹配到正则表达式的文字字符串,如果这替换的比您想要的要多。

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

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

Use Java String Method 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

最新更新