我有以下代码,它应该从字符串的一部分中删除所有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 :(得分: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();
}
答案 1 :(得分: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>