使用Java正则表达式替换文本中的变量

2,841 阅读1分钟

Java正则表达式经常用来替换字符串中匹配的子串,除了使用replaceFirstreplaceAll之外,Matcher还提供了两个更加灵活和强大的方法,appendReplacementappendTail

public Matcher appendReplacement(StringBuffer sb, String replacement)

该方法实现了一个非终止的追加-替换步骤,通常使用在匹配的循环里。例如:

while(matcher.find()){
    matcher.appendReplacement(buffer,"${REPLACEMENT}"));
}
  1. 这个方法维护了一个追加子串偏移,最初为0。当找到匹配的子串时,它从字符串中读取子串,追加到字符缓冲中,读取从追加子串偏移开始,到上一次匹配子串开始偏移结束。

  2. 然后将替换字符串追加到字符缓冲中。

  3. 接着更新追加子串偏移值为上一次匹配的子串最后一个字符偏移加1。

public Matcher appendTail(StringBuffer sb)

这个方法读取从追加子串偏移开始到字符串结尾的子串,追加到字符缓冲。它是一个终止步骤。

下面这个简单的例子演示如何使用这两个方法逐步替换一个字符串模板中的变量。

public class TemplateInterpolation {

    public static void main(String[] args){
        Properties properties = System.getProperties();
        Pattern pattern = Pattern.compile("\\$\\{\\w+(\\.\\w+)+\\}");

        StringBuffer buffer = new StringBuffer();
        String template = "Info: ${os.name} version ${os.version} is used.";

        Matcher matcher = pattern.matcher(template);

        while(matcher.find()){
            String variable = template.substring(matcher.start(), matcher.end());
            matcher.appendReplacement(buffer, 
                    properties.getProperty(variable.substring(2,variable.length() - 1), "NONE"));
        }

        matcher.appendTail(buffer);
        System.out.println(buffer.toString());
    }
}