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);
结果:
name
test/foo_bar/something
图案详情
\$
- 一个 $
字符
([^$]*)
- Capturing group 1 匹配除 $
以外的零个或多个字符 char
\$
- $
字符。
我想检查一个字符串,看它是否包含 $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);
结果:
name
test/foo_bar/something
图案详情
\$
- 一个$
字符([^$]*)
- Capturing group 1 匹配除$
以外的零个或多个字符 char\$
-$
字符。