我在当前的Java项目中有以下场景:
属性文件:
animal1=cat
animal2=dog
Java方法:
public String replace(String input) {
return input.replaceAll("%(.*?)%", properties.getProperty("$1"));
}
显示properties.getProperty("$1")
的部分显然不起作用,因为它将返回键“$ 1”的属性,但不会返回$ 1的实际值。
是否有任何简单的方法可以替换例如“%animal1%”和“cat”?
属性文件将包含几百个条目,因此搜索属性文件中的每个值都可以替换的子字符串不是一个选项。
答案 0 :(得分:1)
如果我理解正确,您需要手动使用Matcher类中的appendReplacement
和appendTail
方法。这样您就可以传递properties.getProperty(matcher.group(1))
以下是如何使用它的基本示例。在此示例中,我搜索了一些关键字,例如string
或secret
来替换它们。替换是基于像
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