繁体   English   中英

java正则表达式查找和替换

[英]java regular expression find and replace

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

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

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

我怎么能代替env11env22env33 ,所以在此之后我将有一个新的字符串1sojods23

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

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

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

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

String line ="${env1}sojods${env2}${env3}";

System.out.println( line.replaceAll("\\$\\{env([0-9]+)\\}", "$1") );

// Output => 1sojods23

DEMO

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

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

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

    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

您可以将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();
    }
}
    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 - keys可以是env1,env2 ..

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM