2012-07-19 87 views
2

我有下面的代碼應該從部分字符串中刪除所有的HTML,這是由美元符號引用(可能更多)。這工作正常,但我也需要保留這些美元符號。任何建議,謝謝從只有一部分字符串中刪除html

private static String removeMarkupBetweenDollars(String input){ 
    if ((input.length()-input.replaceAll("\\$","").length())%2!=0) 
    { 
     throw new RuntimeException("Missing or extra: dollar"); 
    } 
    Pattern pattern = Pattern.compile("\\$(.*?)\\$",Pattern.DOTALL); 
    Matcher matcher = pattern.matcher(input); 

    StringBuffer sb =new StringBuffer(); 

    while(matcher.find()) 
     { //prepending does NOT work, if sth. is in front of first dollar 
     matcher.appendReplacement(sb,matcher.group(1).replaceAll("\\<.*?\\>", "")); 
     sb.append("$"); //note this manual appending 
    } 
    matcher.appendTail(sb); 
    System.out.println(sb.toString()); 

    return sb.toString(); 
} 

感謝您的幫助!

 String input="<p>$<em>something</em>$</p> <p>anything else</p>"; 
    String output="<p>$something$</p> <p>anything else</p>"; 

更復雜的輸入和輸出:

String input="<p>$ bar <b>foo</b>  bar <span style=\"text-decoration: underline;\">foo</span>  $</p><p>another foos</p> $ foo bar <em>bar</em>$"; 
String output="<p>$ bar foo  bar foo  $</p><p>another foos</p> $ foo bar bar$" 
+0

HTML匹配不應使用正則表達式來完成。 – 2012-07-19 18:50:25

+0

請你提供一個輸入/輸出的例子。 – Chris911 2012-07-19 18:51:17

+0

我知道,但REGEX是擺脫它的最簡單的方法。我不需要做任何事情... – MartinM 2012-07-19 18:52:10

回答

1

只是一些小的調整,您的代碼:

private static String removeMarkupBetweenDollars(String input) { 
    if ((input.length() - input.replaceAll("\\$", "").length()) % 2 != 0) { 
     throw new RuntimeException("Missing or extra: dollar"); 
    } 

    Pattern pattern = Pattern.compile("\\$(.*?)\\$", Pattern.DOTALL); 
    Matcher matcher = pattern.matcher(input); 

    StringBuffer sb = new StringBuffer(); 

    while (matcher.find()) { 
     String s = matcher.group().replaceAll("<[^>]+>", ""); 
     matcher.appendReplacement(sb, Matcher.quoteReplacement(s)); 
    } 
    matcher.appendTail(sb); 

    return sb.toString(); 
} 
+0

這看起來很不錯,謝謝 – MartinM 2012-07-19 19:15:03

0
String output = input.replaceAll("\\$<.*?>(.*?)<.*?>\\$", "\\$$1\\$"); 

在正則表達式的一個關鍵點是在.*?? - 這意味着「非貪婪」匹配,這反過來又意味着「消耗盡可能少的輸入「。如果沒有這個,正則表達式會嘗試儘可能多地使用 - 直到輸入中後續出現的$<html>foo</html>$結束(如果存在的話)。

這是一個測試:

public static void main(String[] args) throws Exception { 
    String input = "<p>$<em>something</em>$</p> <p>and $<em>anything</em>$ else</p>"; 
    String output = input.replaceAll("\\$<.*?>(.*?)<.*?>\\$", "\\$$1\\$"); 
    System.out.println(output); 
} 

輸出:

<p>$something$</p> <p>and $anything$ else</p> 
+0

謝謝你的快速答案,但如果輸入更復雜?看到我編輯的問題? – MartinM 2012-07-19 19:10:08

+0

這適用於單個嵌入式標籤,但如果您有多個' 「

$ 東西 $

和$ 任何 $其他

」'返回'「

$東西 $

和$ 任何其他$

」'(錯誤的)。 – 2012-07-19 19:15:51

+0

@davidpeterson你會相信我在正則表達式中遺漏了一個'?'。現在已經修復了。 – Bohemian 2012-07-19 19:18:57