我试图在输入中找到环境变量并用值替换它们。
env变量的模式是${\\.}
Pattern myPattern = Pattern.compile( "(${\\.})" );
String line ="${env1}sojods${env2}${env3}";
如何将env1
替换为1
,将env2
替换为2
,将env3
替换为3
,
在此之后,我将有一个新的字符串1sojods23
?
答案 0 :(得分:41)
Java中的字符串是不可变的,如果您正在讨论需要查找和替换的任意数量的事情,这会使这有点棘手。
具体而言,您需要在Map
中定义替换,使用StringBuffer
以及appendReplacements()
中的appendTail()
和Matcher
方法。最终结果将存储在StringBuffer
。
Map<String, String> replacements = new HashMap<String, String>() {{
put("${env1}", "1");
put("${env2}", "2");
put("${env3}", "3");
}};
String line ="${env1}sojods${env2}${env3}";
String rx = "(\\$\\{[^}]+\\})";
StringBuffer sb = new StringBuffer();
Pattern p = Pattern.compile(rx);
Matcher m = p.matcher(line);
while (m.find())
{
// Avoids throwing a NullPointerException in the case that you
// Don't have a replacement defined in the map for the match
String repString = replacements.get(m.group(1));
if (repString != null)
m.appendReplacement(sb, repString);
}
m.appendTail(sb);
System.out.println(sb.toString());
输出:
1sojods23
答案 1 :(得分:8)
我知道这是旧的,当我找到它时,我自己正在寻找一个appendReplacement/appendTail
例子;然而,OP的问题并不需要我在这里看到的那些复杂的多线解决方案。
在这种情况下,当要替换的字符串保留我们想要替换的值时,可以使用replaceAll
轻松完成此操作:
String line ="${env1}sojods${env2}${env3}";
System.out.println( line.replaceAll("\\$\\{env([0-9]+)\\}", "$1") );
// Output => 1sojods23
当替换是基于每个匹配的某些条件或逻辑的随机替换时,您可以使用appendReplacement/appendTail
例如
答案 2 :(得分:3)
这会为您提供1sojods23
:
String s = "${env1}sojods${env2}${env3}";
final Pattern myPattern = Pattern.compile("\\$\\{[^\\}]*\\}");
Matcher m = myPattern.matcher(s);
int i = 0;
while (m.find()) {
s = m.replaceFirst(String.valueOf(++i));
m = myPattern.matcher(s);
}
System.out.println(s);
这也有效:
final String re = "\\$\\{[^\\}]*\\}";
String s = "${env1}sojods${env2}${env3}";
int i = 0;
String t;
while (true) {
t = s.replaceFirst(re, String.valueOf(++i));
if (s.equals(t)) {
break;
} else {
s = t;
}
}
System.out.println(s);
答案 3 :(得分:2)
希望你会发现这段代码很有用:
Pattern phone = Pattern.compile("\\$\\{env([0-9]+)\\}");
String line ="${env1}sojods${env2}${env3}";
Matcher action = phone.matcher(line);
StringBuffer sb = new StringBuffer(line.length());
while (action.find()) {
String text = action.group(1);
action.appendReplacement(sb, Matcher.quoteReplacement(text));
}
action.appendTail(sb);
System.out.println(sb.toString());
输出是预期的:1sojods23
。
答案 4 :(得分:0)
您可以将StringBuffer与Matcher appendReplacement()方法结合使用,但如果模式不匹配,则创建StringBuffer没有意义。
例如,这是一个匹配$ {...}的模式。第1组是大括号之间的内容。
static Pattern rxTemplate = Pattern.compile("\\$\\{([^}\\s]+)\\}");
这是使用该模式的示例函数。
private static String replaceTemplateString(String text) {
StringBuffer sb = null;
Matcher m = rxTemplate.matcher(text);
while (m.find()) {
String t = m.group(1);
t = t.toUpperCase(); // LOOKUP YOUR REPLACEMENT HERE
if (sb == null) {
sb = new StringBuffer(text.length());
}
m.appendReplacement(sb, t);
}
if (sb == null) {
return text;
} else {
m.appendTail(sb);
return sb.toString();
}
}
答案 5 :(得分:0)
Map<String, String> replacements = new HashMap<String, String>() {
{
put("env1", "1");
put("env2", "2");
put("env3", "3");
}
};
String line = "${env1}sojods${env2}${env3}";
String rx = "\\$\\{(.*?)\\}";
StringBuffer sb = new StringBuffer();
Pattern p = Pattern.compile(rx);
Matcher m = p.matcher(line);
while (m.find()) {
// Avoids throwing a NullPointerException in the case that you
// Don't have a replacement defined in the map for the match
String repString = replacements.get(m.group(1));
if (repString != null)
m.appendReplacement(sb, repString);
}
m.appendTail(sb);
System.out.println(sb.toString());
在上面的示例中,我们可以将map与key和values一起使用--keys可以是env1,env2 ..
答案 6 :(得分:-1)
匹配后使用群组${env1}
将成为您的第一个群组,然后使用正则表达式替换每个群组中的内容。
Pattern p = Pattern.compile("(${\\.})");
Matcher m = p.matcher(line);
while (m.find())
for (int j = 0; j <= m.groupCount(); j++)
//here you do replacement - check on the net how to do it;)