2017-01-03 2 views
2

У меня есть строки, как показано ниже,Замена всех вхождений строки с ключами RegEx из карты

{Счет = {тип = объект, ID = {тип = целое число, формат = int64}, перечисление = [ ENABLE, DISABLED]}, token = {type = string}}}, AssetPlayerRequest = {type = object, properties = {assetPlayer = {description = Сведения о игровом игроке, {$ ref = #/определения/AssetPlayer}, ImageFile = { тип = объект, свойства = {описание = {тип = строка}, Filepath = {тип = строка}, fileUri = {$ реф = #/определения/URI}}}

Я хочу, чтобы заменить шаблоны RegEx {$ref=#/definitions/URI}, {$ref=#/definitions/AssetPlayer} wit h значения, доступные на карте с такими ключами, как URI, AssetPlayer, которые являются частью самого RegEx.

Как достичь этого в Java 8?

ответ

1

Частично адаптировано из 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}} 
+0

Заметим, что '/' не имеет особого значения в регулярном выражении Java, поэтому не требуется экранирование. И вы можете вытащить строку 'StringBuffer sb = new StringBuffer();' внутри оператора 'if', поскольку она не нужна, когда нет совпадения. Java 9 позволяет разрешить «StringBuilder» здесь. В конце концов… – Holger

0

Общая формула для замены вещи в строке, которая требует больше логики в 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(); 
} 
Смежные вопросы