Это код Java, который может быть полезен:
String text = "A | 1\n" +
"A | 2\n" +
"B | 1\n" +
"B | 2\n" +
"B | 3\n" +
"A | x\n" +
"D | y\n" +
"D | z\n";
String[] sections = text.split("(?<=(.) . .)\n(?!\\1)");
StringBuilder sb = new StringBuilder();
for (String section : sections) {
sb.append(section.substring(0, 1) + " {")
.append(section.substring(3).replaceAll("\n.", ""))
.append(" }\n");
}
System.out.println(sb.toString());
Это печатает:
A { 1 | 2 }
B { 1 | 2 | 3 }
A { x }
D { y | z }
Идея состоит в том, чтобы сделать это в два этапа:
- Сначала разбить на секции
- Затем преобразуйте каждую секцию
Один replaceAll
вариант
Если вы перемежаете {
и }
на входе, который нужно захватить, чтобы их можно было переставить на выходе, это возможно с одним replaceAll
(т. Е. полностью регулярное выражение решение)
String text = "{ A | 1 }" +
"{ A | 2 }" +
"{ B | 1 }" +
"{ B | 2 }" +
"{ B | 3 }" +
"{ C | 4 }" +
"{ D | 5 }";
System.out.println(
text.replaceAll("(?=\\{ (.))(?<!(?=\\1).{7})(\\{)( )(.) .|(?=\\}. (.))(?:(?<=(?=\\5).{6}).{5}|(?<=(.))(.))", "$4$3$2$7$6")
);
Это печатает ( см. Вывод на ideone.org ):
A { 1 | 2 } B { 1 | 2 | 3 } C { 4 } D { 5 }
К сожалению, нет, я не думаю, что это стоит объяснять. Это слишком сложно для того, что делается. По сути, тем не менее, множество утверждений, вложенных утверждений и групп захвата (некоторые из которых будут пустыми строками в зависимости от того, какое утверждение проходит).
Это, без сомнения, самое сложное регулярное выражение, которое я написал.