Вопрос:

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

regex edifact

1988 просмотра

2 ответа

1751 Репутация автора

Я пишу регулярное выражение, которое будет извлекать различные фрагменты информации из списка кодов ЭДИФАКТ ООН. Поскольку существуют десятки тысяч кодов, я не хочу вводить их все, поэтому я решил использовать 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*(?\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
Автор: Intrepid Источник Размещён: 25.10.2012 09:26

Ответы (2)


5 плюса

255563 Репутация автора

Решение

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

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

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

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

Автор: Tim Pietzcker Размещён: 25.10.2012 09:31

0 плюса

379 Репутация автора

пытаться

    [\r\n]{2,}

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

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

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

Автор: Christian Žagarskas Размещён: 13.06.2019 03:52
Вопросы из категории :
32x32