0

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

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

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

4

3 回答 3

2

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

String dirName = "images";
StringUtils.replace(html, "http://server.com/stuff1/", dirName + "/");
于 2012-12-07T17:10:12.753 回答
2

以下应该适用于替换<img>从 server.com 链接到 jpg 的所有标签:

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'");

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

于 2012-12-07T17:15:17.610 回答
0

使用 Java 字符串方法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
于 2012-12-07T17:05:11.370 回答