2012-07-19 86 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