java—用Map中的正则表达式键替换所有出现的字符串

gab6jxml  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(396)

我有下面这样的绳子,
{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}}
我想替换regex模式,比如 {$ref=#/definitions/URI} , {$ref=#/definitions/AssetPlayer} 在Map上有可用的值,比如 URI , AssetPlayer 是正则表达式本身的一部分。
如何在Java8中实现这一点?

vsdwdz23

vsdwdz231#

部分改编自 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}}
vlju58qv

vlju58qv2#

替换字符串中需要更多逻辑的内容的一般公式如下所示 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();
}

相关问题