Как достать ключ-значение с помощью лямбда (Java8) из строки

Вот максимум что я смог сделать

   String msg =  "Validation failed for classes [dao.model.messageslog.MessageLog] during persist time for groups [javax.validation.groups.Default, ]\n" +
                "List of constraint violations:[\n" +
                "\tConstraintViolationImpl{interpolatedMessage='SENDER\"... can contain only not more 50 symbols.\"', propertyPath=sender, rootBeanClass=class .dao.model.messageslog.MessageLog, messageTemplate='SENDER{MessagesLog.size}'}\n" +
                "\tConstraintViolationImpl{interpolatedMessage='PARTICIPANT_ID\"... can contain only not more 32 symbols.\"', propertyPath=participantId, rootBeanClass=class dao.model.messageslog.MessageLog, messageTemplate='PARTICIPANT_ID{MessagesLog.size}'}\n";


        Stream<String> stream = Arrays.stream(msg.split("\n"))
                .filter(s -> s.contains("\t"));
        List<String> collect = stream.collect(Collectors.toList());

Как я могу в этих строках ConstraintViolationImpl{ получить значение полей:

interpolatedMessage='SENDER\"... can contain only not more 50 symbols.\",

rootBeanClass=class dao.model.messageslog.MessageLog,

И вывести в колекцию List, вот в таком виде:

  • message : 'SENDER\"... can contain only not more 50 symbols.\", source : class dao.model.messageslog.MessageLog,

  • message : 'PARTICIPANT_ID\"... can contain only not more 32 symbols.\" , source : class dao.model.messageslog.MessageLog,

Частичное решение

    Stream<String> stream = Arrays.stream(msg.split("\n"))
                .filter(s -> s.contains("\t"))
                .map(s -> s.replaceAll("^([^\\{]+)\\{", ""))
                .map(s -> s.replaceAll("[\"]", ""))
                .map(s -> s.replaceAll("=", ":"));
        List<String> collect = stream.collect(Collectors.toList());

Ответы (0 шт):