正则表达式修改动态src属性

时间:2014-10-08 22:44:14

标签: java html regex

我尝试在特定场景中使用正则表达式,如下所述:

有许多HTML页面,每个页面都包含多个具有动态值的<img src>标记:

Tag1 = <p>Para1 <img src="/A/images/b.txt">Some text</p>   
Tag2 = <p>Para2 <img src="/A/B/images/c.jpeg">Some text</p>  
Tag3 = <p>Para3 <img src="/../images/H/e.png">Some text</p> 
Tag4 = <p>Para4 <img src="/../D/images/G/J/f.gif">Some text</p>

我们定位模式"/<anything>/images/。更换后我们需要的是

Tag1 = <p>Para1 <img src="/library/MYFOLDER/location/b.txt">Some text</p>
Tag2 = <p>Para2<img src="/library/MYFOLDER/location/c.jpeg">Some text</p>
Tag3 = <p>Para3<img src="/library/MYFOLDER/location/H/e.png">Some text</p>
Tag4 = <p>Para4<img src="/library/MYFOLDER/location/G/J/f.gif">Some text</p>

实际发生的事情是非常不同的。这种模式在/images之后吃掉了所有东西并给了我们

Tag1 = <p>Para1 <img src="/library/MYFOLDER/locationp>
Tag2 = <p>Para2<img src="/library/MYFOLDER/locationp>
Tag3 = <p>Para3<img src="/library/MYFOLDER/locationp>
Tag4 = <p>Para4<img src="/library/MYFOLDER/locationp>

这是我使用

的正则表达式模式
"{1}(.){1,}[/images/]{1}<br>

以下是代码:

String subStringTem = "<p><strong>Control Steps:</strong> <img src=\"../images/retain_image.gif\" width=\"20\" > Description.</p>";
String newImagPath = "\"/library/MYFOLDER/location";
final Pattern p = Pattern.compile("\"{1}(.){1,}[/images/]{1}");
final Matcher m = p.matcher(subStringTem);
String result = m.replaceAll(newImagPath);
System.out.println(result);

预期结果:

<p><strong>Control Steps:</strong> <img src="/library/MYFOLDER/location/retain_image.gif\" width=\"20\" > Description.</p> 

实际结果:

<p><strong>Control Steps:</strong> <img src="/library/MYFOLDER/locationp>

2 个答案:

答案 0 :(得分:3)

正则表达式中最大的错误是使用方括号。在正则表达式中,[abc]匹配一个字符abc;它与子串"abc"不匹配。所以[/images/]没有按照你的想法去做。删除方括号。

你的正则表达式实际发生了什么:

"{1}(.){1,}[/images/]{1}

它会匹配引号字符,后跟一个或多个字符匹配,后跟一个字符/images。 (最后一个/将被忽略,因为你已经在集合中有一个。)此外,当你告诉它匹配任何一个或多个匹配的字符时,默认它会执行 greedy 匹配,匹配尽可能多的字符。因此,它将停在方括号中最远的字符处,而不是最近的字符;最远的字符是/中的</p>

请尝试使用此正则表达式:

".+?/images/

你永远不需要告诉正则表达式恰好与{1}匹配一个匹配项;它会自动为您完成。 +{1,}的简写。 ?告诉正则表达式匹配最少数量的字符,而不是最大数字。然后它将查找最近的/images/子字符串。

答案 1 :(得分:0)

如果要替换的所有位置实际上始终相同,即假设您要将assets/images/somefolder/a.png替换为img/a.png,则可以非常轻松地在字符串上使用replace方法相反,所以在你的情况下 也许是子串的东西?

如果这看起来很简单,那么使用正则表达式会严重过度杀伤。 试试这样的事情

String src = "/A/images/b.txt";
String othersrc = "/library/MYFOLDER/";
//remove everything from before /images/ and replace it with your path
src = othersrc + src.substring(src.lastIndexOf("/images/") + 1, src.length());
System.out.println(src);

结果:
/library/MYFOLDER/images/b.txt