Я неплохо разбираюсь в RegEx, но не могу понять, как они работают.
Как выполнить поиск/замену в NotePad++ и убедиться, что выходные данные имеют фиксированную длину, а входные данные могут быть гибкими?
Например, если применить регулярное выражение к этому: 23-6-2016
чтобы получить: 23-06-2016
(дополнительный 0 для 06, но не для 12, например)
Другой вариант — создать это:
TestString
и Test
станет
TestString______________________
(дополнительными пробелами.)
Test____________________________
(дополнительными пробелами.)
Конечно, идея здесь заключается в выполнении массового поиска/замены, при котором все выходные данные будут иметь одинаковую длину.
Пожалуйста, объясните, в чем заключается эта мысль.
EDIT: чтобы дать представление о данных, с которыми я работаю, вот пример строки, которую мне нужно обработать:
12345678 TXT 19700101 0 100 20160624 100 Comment text
12345678 TXT 19700101 100 100,25 20160624 0,25 Comment text
12345678 TXT 19700101 100,25 100,5 20160624 0,25 Comment text
Обратите внимание, что они разделены табуляцией. Первый 0 в первой строке должен быть отформатирован как 0,00, 100 как 100,00, но 12345678 и даты не должны быть отформатированы как ,00. Последние 100,5 должны быть отформатированы как 100,50.
Я обошел стороной тему с датами, так что сейчас это не так важно.
решение1
В ответ на:
12345678 TXT 19700101 0 100 20160624 100 Текст комментария 12345678 TXT 19700101 100 100,25 20160624 0,25 Текст комментария 12345678 TXT 19700101 100,25 100,5 20160624 0,25 Текст комментария
Для 4-го столбца:
^((?:\S+\s+){3}\d+)(\s)
до \1,0\2
^((?:\S+\s+){3}\d+,\d)(\s)
до\10\2
Для 5-го/7-го столбца:
аналогично предыдущему, просто замените {3}
на {4}
/ {6}
в правиле соответственно
The1-е правилодобавляется ,0
к числам без ,
. Теперь все числа должны иметь ,\d
.
The2-е правилодобавляет a 0
к тем, у которых после запятой стоит одна цифра.
Что касается(?:)
:группа без захвата, предыдущие столбцы уже захвачены, \1
поэтому дополнительный захват не нужен.
Это только дополняет число до 2 знаков после запятой. Чтобы дополнить произвольное число, используйте подход pad excessively, then trim
.
Последнее слово?
По моему мнению, простое регулярное выражение, как в notepad++, не подходит для этой задачи. Некоторые базовые скрипты, такие как bash или perl, справились бы с этим с гораздо большей читабельностью.
решение2
Раздел A: Подкладка до определенной длины
Чтобы дополнить строки справа на N символов с помощью регулярных выражений, добавьте N пробелов в конец строки, затем сгруппируйте первые N символов, заменив остальные.
Проход 1: Добавление символов заполнения
Найти: $
Заменить:______________________________
В конце строки добавьте 30 пробелов. (Я использовал подчеркивания, так как пробелы не форматируются в сообщении).
Проход 2: Обрезка слева на 30 символов
Чтобы добавить дату, разделенную дефисом, в начале строки, соответствующим образом сопоставьте каждый раздел.
Найти: ^([[:print:]]{0,30}).*$
Заменить на\1
В начале строки замените группу длиной до тридцати печатных символов, а затем все оставшиеся символы этой группой.
Чтобы выбрать другую длину строки, используйте n-пробелов в проходе 1, а затем замените 30 на длину в проходе 2.
Раздел B: Строка, начинающаяся с даты
Пропуск 1 (день месяца):
Найти что: ^([0-9])-
Заменить на:0\1-
Замените шаблон (строку, начинающуюся с одной цифры, за которой следует тире) на дополненный ноль, цифру и тире.
Пропуск 2 (месяц):
Найти что: -([0-9])-
Заменить на:-0\1-
Замените шаблон (одну цифру между двумя тире) на тире, дополненный ноль, цифру и тире.