正则表达式从文件名中删除空格

时间:2011-09-15 00:12:05

标签: java android regex

我有一些包含图片的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());
}

所以真正的问题是,如何使用正则表达式有效地从图像名称中删除空格。

谢谢。

2 个答案:

答案 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();
}