Java 中的通配符匹配和替换

Wildcard match and replace in Java

我想检查一个字符串,看它是否包含 $wildcard$,如果包含,我想提取“$ $”之间的值,我将使用它来检索替换值。然后替换完整的新字符串(同时删除 $ $)

编辑:设法让它工作 demo

String subject = "test/$name$/something";
String replace = "foo_bar";
Pattern regex = Pattern.compile("(\$).*?(\$)");
Matcher m = regex.matcher(subject);

StringBuffer b= new StringBuffer();
while (m.find()) {
     String something = m.group(0);
     System.out.println(something);
     m.appendReplacement(b, replace);
}
m.appendTail(b);
String replaced = b.toString();
System.out.println(replaced);

给我

的输出
$name$
test/foo_bar/something

我可以通过子字符串删除 lead/trailing $,但是有没有办法将它们分成几组,这样我就可以得到 $ $ 之间的内容。但也要确保初始检查确保它有开始和结束 $

它与您要求的语法略有不同,但请查看 Apache Commons 文本:https://commons.apache.org/proper/commons-text/javadocs/api-release/org/apache/commons/text/StrSubstitutor.html

这将使您可以执行以下操作:

    Map<String,String> substitutions = ImmutableMap.of("name", "foo_bar");
    String template = "/test/${name}/something";
    StrSubstitutor substitutor = new StrSubstitutor(substitutions);
    System.out.println(substitutor.replace(template));

您可以构建自己的地图来填充您的替换值。

为标签内容再添加一个匹配组:

Pattern.compile("(\$)(.*?)(\$)");

从两个 \$ 中删除不必要的捕获组,将捕获组设置为匹配两个 $ 字符之间的模式(这里使用的最有效的构造是取反字符 class [^$]), 然后直接抓取 .group(1):

的值
String subject = "test/$name$/something";
String replace = "foo_bar";
Pattern regex = Pattern.compile("\$([^$]*)\$"); // ONLY 1 GROUP ROUND [^$]*
Matcher m = regex.matcher(subject);
StringBuffer b= new StringBuffer();
while (m.find()) {
    String something = m.group(1); // ACCESS GROUP 1
    System.out.println(something);
    m.appendReplacement(b, replace);
}
m.appendTail(b);
String replaced = b.toString();
System.out.println(replaced);

Java demo

结果:

name
test/foo_bar/something

图案详情

  • \$ - 一个 $ 字符
  • ([^$]*) - Capturing group 1 匹配除 $ 以外的零个或多个字符 char
  • \$ - $ 字符。