【问题标题】:Java regex replace multiple file paths in a large StringJava 正则表达式替换大字符串中的多个文件路径
【发布时间】:2012-11-25 21:34:09
【问题描述】:

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

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

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

【问题讨论】:

  • 您期望的最终结果是什么?有点不清楚你用images/替换路径是什么意思,你只想要&lt;img src='images/img1.jpg' /&gt;&lt;img src='images/img2.jpg' /&gt;吗?
  • 是的,对不起。文件名应保留为需要更改的变量路径。图片/img1.jpg 图片/img2.jpg。所有路径都应指向 images/ 目录。

标签: java regex string parsing html-parsing


【解决方案1】:

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

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

【讨论】:

  • 这很酷,但是 stuff1/ 目录是可变的并且可以是任何东西。我需要一种方法来包含和更改可变目录
  • 然后将变量作为第三个参数:StringUtils.replace(html, "http://server.com/stuff1/", dirName + "/");
【解决方案2】:

以下内容应该适用于替换链接到 server.com 中的 jpg 的所有 &lt;img&gt; 标记:

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

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

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

这是可行的,因为[^']*/ 将匹配尽可能多的非单引号字符,然后是文字“/”,因此它将消耗整个路径。如果所有 &lt;img&gt; 标记都来自 server.com,您可以删除 http://server.com 并且正则表达式将以相同的方式工作。

请注意,如果您事先知道所有图像标签都需要替换,或者您的字符串仅包含&lt;img&gt; 标签,则可以进一步缩短它,例如,您可以使用以下内容来替换所有src 属性中的路径:

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

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

【讨论】:

  • 可悲的是,这看起来不起作用。它只是替换最后一个 标记,其余的都完全从字符串中删除。我认为它正在用 1 个字符串替换所有实例。
  • 您是否对所有 src 属性使用单引号?
  • 不,它们实际上是双引号。不得不稍微修改你的代码。
  • 刚刚编辑了我的答案以包含双引号的替代方案。
【解决方案3】:

使用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

【讨论】:

    猜你喜欢
    • 2021-03-16
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2021-10-10
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多