2

私は次のコードを持っています。これは、ドル記号で引用されている文字列の一部からすべての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$"
4

2 に答える 2

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();
}
于 2012-07-19T19:12:21.937 に答える
0
String output = input.replaceAll("\\$<.*?>(.*?)<.*?>\\$", "\\$$1\\$");

正規表現の重要なポイントの1つは、?inです。.*?これは、「貪欲でない」一致を意味します。つまり、「可能な限り最小限の入力を消費する」ことを意味します。これがないと、正規表現は可能な限り多くを消費しようと$<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>
于 2012-07-19T18:58:30.710 に答える