2011-09-15 101 views
0

我有一些包含圖像的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

Oli,感謝您的稱號。但以下代碼在所有模擬器和星系手機上都可以,但在我的xoom上不能。第二個img沒有顯示。 @Override 公共無效的onCreate(捆綁savedInstanceState){ super.onCreate(savedInstanceState); WebView webView = new WebView(this); 字符串htmlString = 「」 + 「icon.png」 + 「i con.png」 + 「」; webView.loadDataWithBaseURL(null,htmlString,「text/html」,「utf-8」,null); setContentView(webView); } – ThinkChris

回答

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(); 
} 
+1

哦,並且str.split(「」)應該被預編譯爲一個模式。 – RichW

+0

謝謝@RickW,這個函數很有幫助,我認爲這個工作對於正則表達式可能太難了。 – ThinkChris

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(); 
} 
+0

嗨@Jacob,感謝您的代碼,它是有幫助的。我決定不使用正則表達式,因爲HTML字符串相當長的一段時間。 – ThinkChris