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

Я борюсь с регулярным выражением в Notepad++. Мне нужно извлечь всю информацию между наборами скобок в большой файл .txt из eQuest, удалив остальное. Текст и целые числа в скобках занимают несколько строк. Наконец, я пытался напечатать данные в скобках на отдельной строке.

Вот фрагмент данных:

"EL1 Bldg Occup WD" = DAY-SCHEDULE_PD
    TYPE            = FRACTION
    VALUES          = [ 0, &D, &D, &D, 0, 0, 0.15, 0.3, 0.6, 0.9, 1, 0.85, 0.75, 0.8, 0.9, 0.8, 0.7, 0.6, 0.2, 0.1, 0, 0, 0, 0 ]
 ..
"EL1 Bldg Occup WEH" = DAY-SCHEDULE-PD
    TYPE             = FRACTION
    VALUES           = [ 0, &D, &D, &D, &D, &D, 0.1, &D, &D, &D, &D, &D, &D, 
     &D, &D, 0 ]
..
"EL1 Bldg InsLt WD" = DAY-SCHEDULE-PD
    TYPE             = FRACTION
    VALUES           = [ 0.1, &D, &D, &D, 0.1, 0.1, 0.5, 0.8, 0.85, 0.95, &D, 
     &D, &D, &D, &D, 0.8971, 0.8709, 0.6, 0.6, 0.3, 0.15, 0.15, 0.15, 
     0.15 ]
..
"EL1 Bldg InsLt Sat" = DAY-SCHEDULE-PD
    TYPE             = FRACTION
    VALUES           = [ 0.15, &D, &D, &D, &D, &D, 0.3, &D, &D, &D, &D, &D, &D, 
     &D, &D, 0.15 ]
..
"EL1 Bldg InsLt Sun" = DAY-SCHEDULE-PD
     TYPE             = FRACTION
     VALUES           = [ 0.15 ]
..
"EL1 Bldg InsLt HDD" = DAY-SCHEDULE-PD
     TYPE             = FRACTION
     VALUES           = [ 0 ]
..
"EL1 Bldg Misc WD" = DAY-SCHEDULE-PD
     TYPE             = FRACTION
     VALUES           = [ 0.2, &D, &D, &D, 0.2118, 0.3452, 0.7395, 0.8743, 
     0.8977, 0.9, &D, &D, &D, &D, &D, &D, &D, 0.8385, 0.5067, 0.3161, 
     0.2517, 0.2075, 0.2 ]
..
"EL1 Bldg Misc Sat" = DAY-SCHEDULE-PD
     TYPE             = FRACTION
     VALUES           = [ 0.2 ]
..

Результат, который я ищу, выглядит следующим образом:

 0, &D, &D, &D, 0, 0, 0.15, 0.3, 0.6, 0.9, 1, 0.85, 0.75, 0.8, 0.9, 0.8, 0.7, 0.6, 0.2, 0.1, 0, 0, 0, 0 
 0, &D, &D, &D, &D, &D, 0.1, &D, &D, &D, &D, &D, &D, &D, &D, 0 
 0.1, &D, &D, &D, 0.1, 0.1, 0.5, 0.8, 0.85, 0.95, &D, &D, &D, &D, &D, 0.8971, 0.8709, 0.6, 0.6, 0.3, 0.15, 0.15, 0.15, 0.15 
 0.15, &D, &D, &D, &D, &D, 0.3, &D, &D, &D, &D, &D, &D, &D, &D, 0.15 
 0.15 
 0 
 0.2, &D, &D, &D, 0.2118, 0.3452, 0.7395, 0.8743, 0.8977, 0.9, &D, &D, &D, &D, &D, &D, &D, 0.8385, 0.5067, 0.3161, 0.2517, 0.2075, 0.2 
 0.2 

Спасибо!


person Connor    schedule 27.01.2017    source источник
comment
Блокнот++ или Блокнот++?   -  person Toto    schedule 28.01.2017
comment
Notepad++, спасибо за исправление - отредактировал заголовок.   -  person Connor    schedule 30.01.2017


Ответы (1)


Если вы не возражаете против запуска нескольких регулярных выражений в наборе данных, это должно быть довольно просто. Я не могу придумать, как вы можете запустить одно регулярное выражение, чтобы получить точный результат, которого вы пытаетесь достичь.

Регулярное выражение 1

   Find what: ^.+?(\[[^\]]+\])?$
Replace with: $1

Регулярное выражение 2

   Find what: (\r?\n)+
Replace with: \r\n

Регулярное выражение 3

   Find what: ,\s*\r\n\s*
Replace with: , 

ПРИМЕЧАНИЕ. Замена на имеет пробел в конце. Так что это ", ".

Регулярное выражение 4

   Find what: ^\[\s([^\]]+)\s\]
Replace with: $1

Вывод нескольких регулярных выражений

0, &D, &D, &D, 0, 0, 0.15, 0.3, 0.6, 0.9, 1, 0.85, 0.75, 0.8, 0.9, 0.8, 0.7, 0.6, 0.2, 0.1, 0, 0, 0, 0
0, &D, &D, &D, &D, &D, 0.1, &D, &D, &D, &D, &D, &D,&D, &D, 0
0.1, &D, &D, &D, 0.1, 0.1, 0.5, 0.8, 0.85, 0.95, &D,&D, &D, &D, &D, 0.8971, 0.8709, 0.6, 0.6, 0.3, 0.15, 0.15, 0.15,0.15
0.15, &D, &D, &D, &D, &D, 0.3, &D, &D, &D, &D, &D, &D,&D, &D, 0.15
0.15
0
0.2, &D, &D, &D, 0.2118, 0.3452, 0.7395, 0.8743,0.8977, 0.9, &D, &D, &D, &D, &D, &D, &D, 0.8385, 0.5067, 0.3161,0.2517, 0.2075, 0.2
0.2
person Nathan    schedule 28.01.2017
comment
Если вы не возражаете против вызова, можно ли обратить этот процесс вспять? Я выполняю анализ и редактирую вывод из нескольких регулярных выражений и возвращаю его в том же формате, что и вывод. Как мне запустить поиск и заменить Regrex в точном формате из исходных данных? Я изо всех сил пытаюсь сохранить тот же формат данных ... для того, чтобы eQuest снова прочитал файл с замененными данными, он должен сохранить те же ограничения разрыва строки из исходного фрагмента данных, который я опубликовал. - person Connor; 30.01.2017
comment
Да, я люблю вызовы. Я предполагаю, что вам нужно будет найти/заменить поле VALUES конкретного элемента EL1 Bldg. Это потребует сохранения дополнительной информации в выходном формате. Похоже, что есть вероятность дублирования значений, и вы будете изменять значения во время анализа. Это означает, что ваш вывод будет полностью отличаться от поля, которое вы хотите заменить. Итак, на этом этапе я бы написал код, который мог бы анализировать формат и перестраивать строку. Есть несколько способов подойти к этому, но лучший подход зависит от ваших бизнес-правил. - person Nathan; 31.01.2017
comment
Если бы мы могли ограничить проблему с помощью бизнес-правил, то это потенциально возможно сделать с помощью регулярного выражения. Однако мне нужно посмотреть, как можно определить, что строка x соответствует элементу y. Я предполагаю, что это будет сделано на основе номера строки, поэтому синтаксический анализатор будет лучшим/более простым подходом на данный момент. - person Nathan; 31.01.2017
comment
Да, я бы заменил поле значений обратно в том порядке, в котором они пришли с моими отредактированными наборами значений. Существует возможность дублирования значений, поскольку разные элементы заголовка могут иметь те же выходные значения, что и другие элементы заголовка. Насколько я понимаю, единственный способ узнать, какое поле значения соответствует какому заголовку, — это порядок, в котором они представлены. Наконец, мои наборы значений окружены () вместо [] выше, так файл читается Equest. И строки значений ограничены 79 символами, прежде чем они перейдут на следующую строку. lmk, если вам нужен реальный файл, чтобы увидеть, что происходит - person Connor; 31.01.2017