Как транспонировать фрагменты данных с помощью регулярных выражений в Notepad ++ - PullRequest
0 голосов
/ 11 октября 2019

Я очень новичок в мире регулярных выражений. Я пытаюсь использовать Notepad ++ с использованием Regex для следующего:

Входной файл выглядит примерно так, и существует несколько таких файлов: Код:

abc
17
015
0 7
4.3
5/1
***END***
abc
6
71
8/3
9 0
***END***
abc
10.1
11
9
***END***

Мне нужно иметь возможность редактироватьтекст во всех этих файлах, чтобы все файлы выглядели так:

Code:
abc
1,2,3,4,5
***END***
abc
6,7,8,9
***END***
abc
10,11,12
***END***

Также:

  1. В некоторых файлах число * вокруг слова ENDварьируется, есть ли способ обобщить число *, поэтому мне не нужно об этом беспокоиться?
  2. Перед abc s есть некоторые дополнительные данные, которые не нужно транспонировать, каксохранить эти данные в том виде, в каком они есть, и перенести данные между abc и ***END***.

Пожалуйста, помогите мне. Ваша помощь очень ценится!

Ответы [ 2 ]

1 голос
/ 11 октября 2019

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

Find:    ^(\d+)\R(?!\*{1,}END\*{1,})
Replace: $1,

Демонстрация

Вот описание шаблона регулярных выражений:

^                        from the start of the line
    (\d+)                match AND capture a number
    \R                   followed by a platform independent newline, which
    (?!\*{1,}END\*{1,})  is NOT followed by ***END***

Внимательно обратите внимание на отрицательный прогноз в конце шаблона, что гарантирует, что мы не будем выполнять замену последнего номера в каждом разделе. Без этого последнее число приведет маркер END к той же строке.

0 голосов
/ 11 октября 2019

Это заменит только между "abc" и "***END***" с любым числом звездочек.

  • Ctrl + H
  • Найти что: (?:(?<=^abc)\R|\G(?!^)).+\K\R(?!\*+END\*+)
  • Заменить на: ,
  • CHECK Регистр
  • CHECK Обтекание
  • CHECK Регулярное выражение
  • UNCHECK . matches newline*
  • Заменить все

Объяснение:

(?:                 # non capture group
    (?<=^abc)       # positive look behind, make sure we have "abc" at the  beginning of line before  
    \R              # any kind of linebreak
  |                 # OR
    \G              # restart from last match position
    (?!^)           # negative look ahead, make sure we are not at the beginning of line
)                   # end group
.+                  # 1 or more any character but newline
\K                  # forget all we have seen until this position
\R                  # any kind of linebreak
(?!\*+END\*+)       # negative lookahead, make sure we haven't ***END*** after

Снимок экрана (до):

enter image description here

Снимок экрана (после):

enter image description here

...