Java-replaceFirst-跳至下一场比赛

时间:2019-06-15 07:21:30

标签: java replace matcher

我试图仅在遇到的<pre>标签内转义HTML(不要问我这样做是否有逻辑)

我确实写了这个简短的程序,它可以正常工作,但是我想跳到下一场比赛,而没有实际添加id="ProcessedTag",所以它不仅仅代替第一场比赛。这是我的代码:

import java.util.regex.Pattern;
import java.util.regex.Matcher;
import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4;

public class ReplaceHTML {
    public static void main(String[] args) {
        String html = "something something < > && \"\" <pre> text\n" +
                "< >\n" +
                "more text\n" +
                "&\n" +
                "<\n" +
                "</pre>\n" +
                "and some more text\n" +
                "<pre> text < </pre>";

        Pattern pattern = Pattern.compile("(?i)(?s)<pre>(.*?)</pre>");
        Matcher matcher = pattern.matcher(html);

        while(matcher.find()) {
            html = html.replaceFirst("(?i)(?s)<pre>(.*?)</pre>", "<pre id=\"ProcessedTag\">" + escapeHtml4(matcher.group(1)) + "</pre>");
        }
        System.out.println(html);
    }
}

因此,为了不只替换第一个匹配项,我决定添加此id="ProcessedTag",以便replaceFirst可以移至下一个匹配项。我猜应该有一种更聪明的方法来做到这一点,而无需添加任何其他内容。 请问这是一个愚蠢的问题,还是以前有人问过(找不到有用的东西)

致谢。

1 个答案:

答案 0 :(得分:1)

您应该在此处使用Matcher#appendReplacement

Pattern pattern = Pattern.compile("(?i)(?s)<pre>(.*?)</pre>");
Matcher matcher = pattern.matcher(html);
StringBuffer buffer = new StringBuffer("");
while (matcher.find()) {
    matcher.appendReplacement(buffer, "<pre>" + escapeHtml4(matcher.group(1)) + "</pre>");
}
matcher.appendTail(buffer);
System.out.println(buffer);

请注意,通常不希望对HTML内容使用正则表达式。但是,在这种情况下,您要替换的标签没有嵌套,正则表达式可能是可行的。