所以我不是正则表达式专家,我正在寻找一种好方法来做到这一点。 我有一个大字符串,其中包含可变数量的<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