【问题标题】:Replace instead of append in java pattern matching?在java模式匹配中替换而不是追加?
【发布时间】:2023-03-08 10:17:01
【问题描述】:

目前,此代码在找到匹配的每一行之后将模式匹配附加到字符串缓冲区。但是,我想进行模式匹配并替换 2 个不同的模式,并且程序打印出找到这两种模式的行的副本,因为它附加了找到模式匹配的每一行。有什么方法可以打印出替换的最后一行?我想我可能必须在第一个模式匹配器中将附加更改为替换,但我不知道有什么方法可以做到这一点。

public static void main(String[] args) throws FileNotFoundException {
    RealReadFile file = new RealReadFile();
    while (!file.endOfFile()) {
        String line = file.nextLine();
        Pattern cpochhammer = Pattern.compile("(\\(([^)]+)\\)_\\{([^}]+)\\})");
        Matcher pochhammer = cpochhammer.matcher(line);
        StringBuffer rplcmntBfr = new StringBuffer();
        while(pochhammer.find())  {
           pochhammer.appendReplacement(rplcmntBfr, "\\\\pochhammer{$2}{$3}");
        }
        pochhammer.appendTail(rplcmntBfr);
        Pattern npochhammer = Pattern.compile("(\\(([^)]+)\\)_(.))");
        Matcher ppochhammer = npochhammer.matcher(rplcmntBfr);
        while(ppochhammer.find())  {
               ppochhammer.appendReplacement(rplcmntBfr, "\\\\pochhammer{$2}{$3}");
            }
            //ppochhammer.appendTail(rplcmntBfr);

        System.out.println(rplcmntBfr);
    }
}

【问题讨论】:

    标签: java regex


    【解决方案1】:

    一旦你将rplcmntBfr 设置到第一个和第二个替换循环之间的匹配器中,你必须清除缓冲区

    rplcmntBfr.setLength(0);
    

    否则,当您在第二个循环中正确替换 rplcmntBfr 的值时,其结果会追加到第一个替换的结果中,这是不正确的。下次替换的结果需要替换rplcmntBfr的内容。

    【讨论】:

    • 但是如果我在设置匹配器后清除缓冲区的内容,第二个替换循环没有任何内容可以替换/追加。运行时出现 StringIndexOutOfBoundsException。
    • 尝试“Matcher ppochhammer = npochhammer.matcher(rplcmntBfr.toString());”
    • 谢谢!这解决了我的问题。为什么它可以与 toString() 一起使用?
    • toString 创建一个新对象。没有它,原件被指向。实际上,我不认为 toString 是必要的,但显然它是必要的。很高兴它成功了。
    猜你喜欢
    • 2011-04-25
    • 2016-10-25
    • 2010-12-13
    • 1970-01-01
    • 2018-02-25
    • 2021-10-18
    • 2012-07-13
    • 1970-01-01
    相关资源
    最近更新 更多