我尝试在特定场景中使用正则表达式,如下所述:
有许多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>
答案 0 :(得分:3)
正则表达式中最大的错误是使用方括号。在正则表达式中,[abc]
匹配一个字符a
,b
或c
;它与子串"abc"
不匹配。所以[/images/]
没有按照你的想法去做。删除方括号。
你的正则表达式实际发生了什么:
"{1}(.){1,}[/images/]{1}
它会匹配引号字符,后跟一个或多个字符匹配,后跟一个字符/
,i
,m
,a
, g
,e
,s
。 (最后一个/
将被忽略,因为你已经在集合中有一个。)此外,当你告诉它匹配任何一个或多个匹配的字符时,默认它会执行 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