java正则表达式查找和替换

我试图在输入中找到环境变量并用值替换它们。

env变量的模式是${\\.}

 Pattern myPattern = Pattern.compile( "(${\\.})" ); String line ="${env1}sojods${env2}${env3}"; 

如何用1取代env1 ,用2替换env1 ,用3替换env1 ,这样我之后会有一个新的字符串1sojods23

Java中的字符串是不可变的,如果你在讨论需要查找和替换的任意数量的东西,这会使这有点棘手。

具体来说,您需要在Map定义替换,使用StringBuffer以及MatcherappendReplacements()appendTail()方法。 最终结果将存储在StringBuffer

 Map replacements = new HashMap() {{ 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 

我知道这是旧的,当我找到它时,我自己正在寻找一个appendReplacement/appendTail示例; 然而,OP的问题并不需要我在这里看到的那些复杂的多线解决方案。

在这种情况下,当要替换的字符串保存自己要替换的值时,可以使用replaceAll轻松完成:

 String line ="${env1}sojods${env2}${env3}"; System.out.println( line.replaceAll("\\$\\{env([0-9]+)\\}", "$1") ); // Output => 1sojods23 

DEMO

当基于每个匹配的某些条件或逻辑替换是随机的时,您可以使用appendReplacement/appendTail作为示例

希望您会发现此代码有用:

  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

这给你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); 

您可以将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(); } } 

匹配后使用组${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;)