code: @API(status = MAINTAINED)
      public static BodyFilter replaceJsonStringProperty(final Set<String> properties, final String replacement) {
          final String regex = properties.stream().map(Pattern::quote).collect(joining("|"));
          final Pattern pattern = Pattern.compile("(\"(?:" + regex + ")\"\\s*:\\s*)\"(?:[^\"\\\\]|\\\\.)*\"");
          final UnaryOperator<String> delegate = body -> pattern.matcher(body).replaceAll("$1\"" + replacement + "\"");
  
          return (contentType, body) ->
                  JsonMediaType.JSON.test(contentType) ? delegate.apply(body) : body;
      }
docs: Creates a {@link BodyFilter} that replaces the properties in the json response with the replacement passed as argument.
  This {@link BodyFilter} works on all levels inside the json tree and it only works with string values<br><br>
  Example from {@link AccessTokenBodyFilter} method:<br>
  <pre>{@code
  Set<String> properties = new HashSet<>();
  properties.add("access_token");
  properties.add("open_id");
  properties.add("id_token");
  return replaceJsonStringProperty(properties, "XXX");
  }</pre>
  
  @param properties  JSON properties to replace
  @param replacement String to replace the properties values
  @return BodyFilter generated