Java:用方法结果替换RegEx

时间:2014-10-22 16:04:07

标签: java regex string replace properties

我在当前的Java项目中有以下场景:

属性文件:

animal1=cat
animal2=dog

Java方法:

public String replace(String input) {
  return input.replaceAll("%(.*?)%", properties.getProperty("$1"));
}

显示properties.getProperty("$1")的部分显然不起作用,因为它将返回键“$ 1”的属性,但不会返回$ 1的实际值。

是否有任何简单的方法可以替换例如“%animal1%”和“cat”?

属性文件将包含几百个条目,因此搜索属性文件中的每个值都可以替换的子字符串不是一个选项。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您需要手动使用Matcher类中的appendReplacementappendTail方法。这样您就可以传递properties.getProperty(matcher.group(1))

的结果

以下是如何使用它的基本示例。在此示例中,我搜索了一些关键字,例如stringsecret来替换它们。替换是基于像

这样的映射动态决定的
  • string->foo
  • secret->whatever

并通过简单地从存储此映射的Map调用get(keyword)来确定。

String data = "some string with some secret data";

Map<String,String> properties = new HashMap<>();
properties.put("string", "foo");
properties.put("secret", "whatever");

Pattern p = Pattern.compile("string|secret");
Matcher m = p.matcher(data);

StringBuffer sb = new StringBuffer();
while (m.find()){
    m.appendReplacement(sb, properties.get(m.group()));//replace found match 
                                                //with result based on group
}
m.appendTail(sb);//append rest of text after last match, in our case " data"

String result = sb.toString();
System.out.println("Original: " + data);
System.out.println("Replaced: " + result);

结果:

Original: some string with some secret data
Replaced: some foo with some whatever data

答案 1 :(得分:1)

不要试图像oneliner那样做。如果使用循环检查可能匹配的所有模式

这里有一些代码可以帮助你(这应该按原样编译和运行)

package org.test.stackoverflow;

import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PatternReplacer {
  private final Pattern keyPattern = Pattern.compile("%([^%]*)%");
  private final Properties properties;

  public PatternReplacer(Properties propertySeed) {
    properties = propertySeed;
  }

  public String replace(String input) {
    int start = 0;

    while(true) {
      Matcher match = keyPattern.matcher(input);

      if(!match.find(start)) break;

      String group = match.group(1);
      if(properties.containsKey(group)) {
        input = input.replaceAll("%" + group + "%", properties.getProperty(group));
      } else {
        start = match.start() + group.length();
      }
    }

    return input;
  }

  public static void main(String... args) {
    Properties p = new Properties();
    p.put("animal1", "cat");
    p.put("animal2", "dog");

    PatternReplacer test = new PatternReplacer(p);
    String result = test.replace("foo %animal1% %bar% %animal2%baz %animal1% qu%ux");
    System.out.println(result);
  }
}

输出:

foo cat %bar% dogbaz cat qu%ux