использование регулярного выражения для возврата всего текста между двумя разными строками, кроме случаев, когда он находит новый раздел - PullRequest
1 голос
/ 03 апреля 2020

Мне нужно прочитать текстовый файл с диска и вернуть все строки между двумя разными строками (эту часть я уже решил). Но если новый раздел найден без E :, он ничего не должен возвращать.

Итак, у меня есть этот текстовый файл:

[NT_BASIC]
"SYSTEM"            WARNING      1 GB                                       * 0000 2400
"SYSTEM"            MINOR        500 MB                                     * 0000 2400

[OTHERS],[DB2]
"D:"                WARNING      1 GB                                       * 0000 2400
"D:"                MINOR        500 MB                                     * 0000 2400
"E:"                WARNING      1 GB                                     1-5 0700 1700
"E:"                MINOR        500 MB                                   1-5 0700 1700
"F:"                WARNING      5 %                                      1-5 0700 1700
"F:"                MINOR        2 %                                      1-5 0700 1700
"H:"                WARNING      1 GB                                     1-5 0700 1700
"H:"                MINOR        500 MB                                   1-5 0700 1700

И с этим выражением: Я могу вернуть весь текст между [NT_BASIC] и E:

(?=NT_BASIC)([\s\S]*?)(?<=E:)

Однако, поскольку есть новый раздел информации (пустая строка, за которой следует «[» и другой тип раздела - в этом case " [OTHERS], [DB2] "), я не хочу ничего возвращать.

Есть ли способ добиться этого с помощью регулярных выражений?

Ответы [ 2 ]

3 голосов
/ 03 апреля 2020

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

^\[NT_BASIC](?:,\[[^\r\n\]]*])*(?:\r?\n(?!\r?\n\[).*)*\r?\n"E:"

Объяснение

  • ^ Начало строки
  • \[NT_BASIC] Совпадение [NT_BASIC]
  • (?: Группа без захвата
    • ,\[[^\r\n\]]*] Совпадение с запятой и открытием до закрывающей скобки [...]
  • )* Повторите 0+ раз
  • (?: Группа без захвата
    • \r?\n(?!\r?\n\[) Соответствует новой строке, подтвердите, что прямо направо не является новой строкой, за которой следует [
    • .* Соответствует всей строке
  • )* Закройте группу и повторите 0+ times
  • \r?\n"E:" Соответствует новой строке, за которой следует "E:"

Regex demo


Другой вариант - сопоставить все строки, которые не начинаются с символа пробела или символа [ с использованием отрицательного класса символов.

Если вы также не хотите сопоставлять двойные кавычки вокруг "E:", вы можете совпадать до первого появления E"

^\[NT_BASIC](?:,\[[^\r\n\]]*])*\r?\n(?:[^\s\[].*\r?\n)*.*?\bE:

Regex demo

0 голосов
/ 03 апреля 2020

У меня есть это:

(?<=\[NT_BASIC\]\s)([\s\S]*?)(?="E:|\s\[)

Тест: https://regexr.com/51pf4

Если вы удалите второй раздел, он будет соответствовать до " E: "

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