我想在输入中找到环境变量并用值替换它们。java的正则表达式查找和替换
环境变量的模式是${\\.}
Pattern myPattern = Pattern.compile("(${\\.})");
String line ="${env1}sojods${env2}${env3}";
我怎么能代替env1
与1
和env2
与2
和env3
与3
,所以 在此之后我将有一个新的字符串1sojods23
?
我想在输入中找到环境变量并用值替换它们。java的正则表达式查找和替换
环境变量的模式是${\\.}
Pattern myPattern = Pattern.compile("(${\\.})");
String line ="${env1}sojods${env2}${env3}";
我怎么能代替env1
与1
和env2
与2
和env3
与3
,所以 在此之后我将有一个新的字符串1sojods23
?
使用组一旦匹配${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;)
我试过这个模式,但得到以下异常: 线程“main”中的异常java.util.regex.PatternSyntaxException:索引1附近的非法重复 ($ {\。}) – user1205079 2012-03-07 16:59:51
希望你会发现此代码有用:
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
。
var name是env_a,env_b和env_c ? – Kent 2012-03-07 17:16:02
好的没有问题组的模式可以改变。我只瞄准OP的特定问题,但我想他可以相应地改变模式(毕竟没有给出好的规范)。 – 2012-03-07 17:17:04
特别感谢您的快速回答,这真的是一个很好的答案。 – user1205079 2012-03-07 17:21:41
这给了你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);
字符串在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
在代码中出现错误 – jjLin 2013-05-01 14:30:57
美丽而优雅......并且以为我有那么多难看的代码尝试使用基本的字符串操作来执行相同的操作......完全相同...... Map et all,替换$ {variables } ...一些清理我的时间。 – YoYo 2013-05-12 19:16:16
例如:“$#,## 0.0”到这个“'$'#,## 0.0” 使用Matcher.quoteReplacement(...) 所以你得到: if(replace!= null) {rf = Matcher.quoteReplacement(“\'”+ replace +“\'”); matcher.appendReplacement(sb,rp); } – 2017-09-08 10:33:36
我知道这是旧的,我自己找,appendReplacement/appendTail
例如,当我发现它;然而,OP的问题并不需要我在这里看到的那些复杂的多线解决方案。
在这个确切的情况下,当更换串持有本身,我们要替换的价值,那么这可以很容易地与replaceAll
完成:
String line ="${env1}sojods${env2}${env3}";
System.out.println(line.replaceAll("\\$\\{env([0-9]+)\\}", "$1"));
// Output => 1sojods23
当更换随机根据每个匹配的某些条件或逻辑,然后可以使用appendReplacement/appendTail
例如
您可以将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();
}
}
你的例子表明模式应该是'$ {[^}] +}'或类似的而不是'$ {\\。}'。 – 2012-03-07 17:00:05
将'envN'折叠为'N',还是使用环境/系统属性中指定给envN的值替换'envN'的目标是? – 2012-03-07 17:13:56