Java - replaceFirst - 跳转到下一场比赛

Java - replaceFirst - jump to next match

我只是在我遇到的 <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 就可以移动到下一个匹配项。我想应该有一种更聪明的方法可以在不添加任何额外内容的情况下做到这一点。 对不起,如果这是一个愚蠢的问题或者之前有人问过(找不到有用的东西)

此致。

您应该在此处使用 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 内容使用正则表达式。但是,在这种情况下,您要替换的标签不是嵌套的,正则表达式可能是可行的。