我想检查一个字符串,看它是否包含$ 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
我可以通过子串来删除前导/尾随$但是有没有办法将这些分成组,所以我可以得到$ $之间的内容。但也要确保初始检查确保它有一个开始和结束$
答案 0 :(得分:1)
为标记内容添加另一个匹配组:
Pattern.compile("(\\$)(.*?)(\\$)");
答案 1 :(得分:0)
它有略微不同的语法,但请查看Apache Commons Text: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));
您可以构建自己的地图以填充替换值。
答案 2 :(得分:0)
从\\$
删除不必要的捕获组,在模式上设置与两个$
字符之间匹配的捕获组(这里使用的最有效的构造是否定字符类{{ 1}}),然后只需获取[^$]
:
.group(1)
请参阅Java demo
结果:
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个匹配的零个或多个字符,而不是([^$]*)
字符$
- \\$
个字符。