Использование регулярных выражений в Java для разделения текстового файла на блоки - PullRequest
1 голос
/ 15 июня 2019

У меня есть текстовый файл, и мне нужно разделить его на блоки с помощью регулярных выражений в Java.

Каждый блок начинается с цифры в начале строки, а остальные имеют отступы.

например:

1.  Here the block starts, and I need to capture
    all the text until the next block starts.
2.  The Second block.


3.  Another block.
        Some indented text.
4.  New block.

        More text.
            Still the 4th block.


    The end of the 4th block.

Я пробовал несколько шаблонов, но не могу понять, как это сделать.

Я думал о:

  1. число в начале строки

  2. немного текста

  3. число в начале строки

Но в этом случае число в (3) не будет включено при следующем совпадении, и шаблон не будет перехватывать следующий блок.

Ответы [ 3 ]

1 голос
/ 15 июня 2019

Вы можете попробовать это регулярное выражение:

^\d.+?(?=^\d|\Z)

Не забудьте использовать опции многострочного и многоточечного:

Matcher m = Pattern.compile("^\\d.+?(?=^\\d|\\Z)", Pattern.MULTILINE | Pattern.DOTALL).matcher(text);
while (m.find()) {
     // m.group() is each of your blocks
}

Пояснение:

Сначала начинается сопоставление цифры в начале строки (^\d), затем лениво сопоставляется все (.+?) до тех пор, пока не будет 1) еще одно начало строки, за которым следует еще одна цифра, или 2) конец строки ((?=^\d|\Z)).

1 голос
/ 15 июня 2019

Вы можете сопоставить цифры 1+ и точку в начале строки и выбрать любой символ 0+ раз, кроме новой строки.

Затем повторите сопоставление всех следующих строк, которые не начинаются с цифр 1+ иточкой:

^\d+\..*(?:\r?\n(?!\d+\.).*)*

Пояснение

  • ^ Начало строки
  • \d+\..* Совпадение 1+ цифр с последующимточка и 0+ символов кроме новой строки
  • (?: Группа без захвата
    • \r?\n Соответствие новой строки
    • (?!\d+\.) Утверждение того, что находится прямо справане является 1+ цифрами, за которыми следует точка
    • .* Соответствует любому символу, кроме новой строки 0+ раз
  • )* Закройте группу без захвата и повторите 0+раз

Regex demo | Java демо

0 голосов
/ 15 июня 2019

Попробуйте найти следующий шаблон:

\d+\.\t(.*?)(?=\d+\.\t|$)

Вот пример сценария:

List<String> blocks = new ArrayList<>();
String input = "1.\tsome content\n\tblah\n2.\tsome more content";
String pattern = "\\d+\\.\t(.*?)(?=\\d+\\.\t|$)";
Pattern r = Pattern.compile(pattern, Pattern.DOTALL);
Matcher m = r.matcher(input);
while (m.find()) {
    blocks.add(m.group(1));
    System.out.println("LINE: " + m.group(1));
}

LINE: some content
      blah

LINE: some more content

Обратите внимание, что мы выполняем поиск по регулярному выражению в режиме DOTALL, поскольку данный блок может занимать несколько строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...