用正则表达式中的键替换一个字符串中的所有出现,并从映射中获取键值。

3
我有一个字符串如下,
{Account={type=object,id={type=integer, format=int64}, enum=[ENABLED, DISABLED]}, token={type=string}}}, AssetPlayerRequest={type=object, properties={assetPlayer={description=The asset player details, {$ref=#/definitions/AssetPlayer},ImageFile={type=object, properties={description={type=string}, filePath={type=string}, fileUri={$ref=#/definitions/URI}}}
我希望用Map中可用的键值(例如URI,AssetPlayer)替换RegEx模式,这些键值是RegEx本身的一部分。要在Java 8中实现此操作,该怎么做?
2个回答

3

部分内容参考自Matcher.replaceAll()

public static void main(String[] args) {
    Map<String, String> replacements = new HashMap<>();
    replacements.put("AssetPlayer", "replacement1");
    replacements.put("URI", "replacement2");
    
    String input = "{Account={type=object,id={type=integer, format=int64}, enum=[ENABLED, DISABLED]}, token={type=string}}}, AssetPlayerRequest={type=object, properties={assetPlayer={description=The asset player details, {$ref=#/definitions/AssetPlayer},ImageFile={type=object, properties={description={type=string}, filePath={type=string}, fileUri={$ref=#/definitions/URI}}}";
    
    Matcher matcher = Pattern.compile("\\{\\$ref=#\\/definitions\\/(.+?)\\}").matcher(input);
    StringBuffer sb = new StringBuffer();
    if (matcher.find()) {
        do {
            String replacement = replacements.get(matcher.group(1));
            matcher.appendReplacement(sb, Matcher.quoteReplacement(replacement));
        } while (matcher.find());
        matcher.appendTail(sb);
        System.out.println(sb.toString());
    } else {
        System.out.println(input);
    }
}

输出:

{Account={type=object,id={type=integer, format=int64}, enum=[ENABLED, DISABLED]}, token={type=string}}}, AssetPlayerRequest={type=object, properties={assetPlayer={description=The asset player details, replacement1,ImageFile={type=object, properties={description={type=string}, filePath={type=string}, fileUri=replacement2}}

自Java 9以来,您可以通过新的函数Matcher.replaceAll()来简化此过程:

String result = Pattern.compile("\\{\\$ref=#\\/definitions\\/(.+?)\\}")
        .matcher(input)
        .replaceAll(match -> Matcher.quoteReplacement(replacements.get(match.group(1))));
System.out.println(result);

请注意,在Java正则表达式中,“/”没有特殊含义,因此不需要转义。当没有匹配时,您可以将“StringBuffer sb = new StringBuffer();”行放在if语句内部,因为它是不必要的。Java 9将允许在此处使用StringBuilder。最后... - Holger

1

对于需要更多逻辑的字符串替换,通用公式在 Matcher#appendReplacement 中:

public String bindTemplateVariables(String input) {
    Pattern p = Pattern.compile("\\{\\$ref=#/definitions/(.*?)\\}");
    Matcher m = p.matcher(input);
    StringBuffer sb = new StringBuffer();
    while (m.find()) {
        String replacement = map.get(m.group(1));
        m.appendReplacement(sb, replacement);
    }
    m.appendTail(sb);
    return sb.toString();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接