Замените регулярное выражение, используя повторный захват - PullRequest
2 голосов
/ 21 мая 2010

У меня есть таблица как:

A | 1  
A | 2  
B | 1  
B | 2  
B | 3

Я пытаюсь преобразовать его так:

A { 1 | 2 }  
B { 1 | 2 | 3 }

Я пришел с этим, который будет соответствовать правильно, я просто не могу понять, как получить повторный захват.

(A|B)|(\d)(\r\n\1|(\d))*

UPDATE

Я понимаю, что это было бы довольно тривиально с некоторыми языками программирования, я надеялся узнать что-то большее о регулярных выражениях.

1 Ответ

1 голос
/ 21 мая 2010

Это код 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 }

К сожалению, нет, я не думаю, что это стоит объяснять. Это слишком сложно для того, что делается. По сути, тем не менее, множество утверждений, вложенных утверждений и групп захвата (некоторые из которых будут пустыми строками в зависимости от того, какое утверждение проходит).

Это, без сомнения, самое сложное регулярное выражение, которое я написал.

...