Java中的通配符匹配和重新生成

时间:2017-10-12 19:42:30

标签: java regex wildcard

我想检查一个字符串,看它是否包含$ 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

我可以通过子串来删除前导/尾随$但是有没有办法将这些分成组,所以我可以得到$ $之间的内容。但也要确保初始检查确保它有一个开始和结束$

3 个答案:

答案 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个匹配的零个或多个字符,而不是([^$]*)字符
  • $ - \\$个字符。