Java-replaceFirst-跳转到下一个匹配项

标签 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可以移动到下一个匹配。我想应该有一种更聪明的方法来做到这一点,而不需要添加任何额外的东西。 对不起,如果这是一个愚蠢的问题或者之前已经被问过(找不到任何有用的东西)

问候。

最佳答案

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

关于Java-replaceFirst-跳转到下一个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56608273/

相关文章:

java - 移动 jButton 时遇到问题

java - 使用 Camera2 拍摄第二张照片时 setPreviewTexture 失败

java - StringBuilder 与 String 考虑替换

regex - 如何使用正则表达式删除具有特定变量的特定行

java - Java的Matcher.group(int)方法如何避免匹配括号内子大括号的内容

java - 在Java中构造新对象时出现堆栈溢出错误

java - Tomcat HttpSession Cookie 共享

regex - 是否可以将REPLACE与LIKE结合起来替换oracle数据库列中的多个值

java - 用于提取 SQL 查询的正则表达式

java - 如何使用isA-Matcher