我有一些包含图片的html字符串。我需要从图片名称中删除空格,因为某些平板电脑不接受它们。 (我已经重命名了所有图像资源)。我认为唯一的修复部分是......
src="file:///android_asset/images/ ?? ?? .???"
因为这些链接是有效的链接。
我花了半天的时间在上面,仍在努力解决性能问题。以下代码有效,但确实很慢......
public static void main(String[] args) {
String str = "<IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye_anatomy 1 .jpg\" width=350 border=0></P> fd ssda f \r\n"
+ "fd <P align=center><IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/ eye_anato my 1 .bmp\" width=350 border=0></P>\r\n"
+ "\r\n<IMG height=286 alt=\"eye_anatomy 1.jpg\" src=\"file:///android_asset/images/eye_anatomy1.png\" width=350 border=0>\r\n";
Pattern p = Pattern.compile("(.*?)(src=\"file:///android_asset/images/)(.*?\\s+.*?)(\")", Pattern.DOTALL);
Matcher m = p.matcher(str);
StringBuilder sb = new StringBuilder("");
int i = 0;
while (m.find()) {
sb.append(m.group(1)).append(m.group(2)).append(m.group(3).replaceAll("\\s+", "")).append(m.group(4));
i = m.end();
}
sb.append(str.substring(i, str.length()));
System.out.println(sb.toString());
}
所以真正的问题是,如何使用正则表达式有效地从图像名称中删除空格。
谢谢。
答案 0 :(得分:1)
这是一个应该更快http://ideone.com/vlspF的函数:
private static String removeSpacesFromImages(String aText){
Pattern p = Pattern.compile("(?<=src=\"file:///android_asset/images/)[^\"]*");
StringBuffer result = new StringBuffer();
Matcher matcher = p.matcher(aText);
while ( matcher.find() ) {
matcher.appendReplacement(result, matcher.group(0).replaceAll("\\s+",""));
}
matcher.appendTail(result);
return result.toString();
}
答案 1 :(得分:1)
正则表达式与正则表达式一样。 :-)严重的正则表达式的东西非常适合特定的情况,但对于这样的东西,我发现自己编写低级代码。所以以下不是正则表达式;这是一个功能。但它可以做你想要的,并且比你的正则表达式更快。 (也就是说,如果有人确实提出了符合条件并且表现良好的正则表达式,我很乐意看到它。)
以下函数使用空格作为分隔符对源字符串进行分段,然后通过在汇编结果时不附加空格来识别和清除alt和src属性。我只使用alt属性,因为你也在那里放置文件名。一个副作用是,这将在标记的其余部分将多个空间折叠到一个空间中,但浏览器无论如何都会这样做。您可以通过重用StringBuilder来优化代码。它假定属性周围有双引号。
我希望这会有所帮助。
private String removeAttrSpaces(final String str) {
final StringBuilder sb = new StringBuilder(str.length());
boolean inAttribute = false;
for (final String segment : str.split(" ")) {
if (segment.startsWith("alt=\"") || segment.startsWith("src=\"")) {
inAttribute = true;
}
if (inAttribute && segment.endsWith("\"")) {
inAttribute = false;
}
sb.append(segment);
if (!inAttribute) {
sb.append(' ');
}
}
return sb.toString();
}