Соответствие двойным разрывам строк с использованием регулярных выражений

Я пишу регулярное выражение, которое будет извлекать различные части информации из списка кодов ООН EDIFACT. Поскольку существуют десятки тысяч кодов, я не хочу вводить их все, поэтому я решил использовать Regex для анализа текстового файла и извлечения нужных мне битов. Текстовый файл структурирован таким образом, чтобы я мог легко определить нужные мне биты.

Я создал следующее Regex, используя Regex Hero, чтобы проверить его, но я просто не могу заставить его соответствовать всему, вплоть до двойного переноса строки для группы codeComment. Я попытался использовать класс символов [^\n\n], но это все равно не будет соответствовать двойным разрывам строк.

Примечание: я выбрал параметр Multiline в Regex Hero.

(?<element>\d+)\s\s(?<elementName>.*)\[[B|C|I]\]\s+Desc: (?<desc>[^\n]*\s*[^\n]*)
^\s*Repr: (?<type>a(?:n)?)..(?<length>\d+)
^\s*(?<code>\d+)\s*(?<codeName>[^\n]*)
^\s{14}(?<codeComment>[^\n]*)

Это пример текста, который я использую, чтобы соответствовать.

-------------------------------------------------- --------------------

  • 1073 Код действия строки документа [B]

    Desc: Код, обозначающий действие, связанное со строкой
    документ.

    Repr: an..3

    1 Включено в документ / транзакцию
    Строка документа включена в
    документ / сделка.
    должен захватить это также.

    2 Исключен из документа / транзакции
    Строка документа исключена из
    документ / сделка.

Я хочу, чтобы codeComment содержал следующее:

The document line is included in the
          document/transaction.
          should capture this as well.

но это только извлечение первой строки:

The document line is included in the

1 ответ

Решение

В классе символов каждый персонаж считается один раз, независимо от того, как часто вы его пишете. Поэтому класс символов нельзя использовать для проверки последовательных разрывов строк. Но вы можете использовать опережающее утверждение:

^\s{14}(?<codeComment>(?s)(?:(?!\n\n).)*)

(?s) включает однострочный режим (чтобы точка соответствовала символам новой строки).

(?!\n\n) утверждает, что в текущей позиции нет двух последовательных разрывов строк.

Пытаться

    [\r\n]{2,}

Чтобы "сопоставить двойной перенос строки"

Используется в DWR для удаления двойных / раздутых разрывов строк (по какой-то причине оставшихся после распаковки файлов)

подробнее: Как удалить ненужные "лишние разрывы строк", которые появляются в файлах PHP/CSS/JS после распаковки?

Этот простой и подходит мне лучше всего:

/[\r]?\n[\r]?\n/g
Другие вопросы по тегам