7

Я довольно хорош в RegEx, но есть одна вещь, которую я не могу понять, как это работает.

Как можно найти / заменить в NotePad++ и убедиться, что вывод имеет фиксированную длину, а ввод может быть гибким?

Например, сделать регулярное выражение для этого: 23-6-2016 чтобы стать: 23-06-2016 (дополнительно 0 за 06, но не если его 12, например)

Другой вариант - создать это:

TestString и Test станут
TestString______________________ (дополнительные пробелы.)
Test____________________________ (дополнительные пробелы.)

Конечно, идея здесь состоит в том, чтобы сделать массовый поиск / замену, где выходные данные имеют одинаковую длину.

Пожалуйста, объясните мысль за этим.

РЕДАКТИРОВАТЬ: чтобы дать представление о данных, с которыми я работаю, вот пример строки, которую мне нужно обработать:

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.

Я обошёл все свидания, так что сейчас это не так важно.

2 ответа2

5

В ответ на:

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

Для 4-го столбца:
^((?:\S+\s+){3}\d+)(\s) до \1,0\2
^((?:\S+\s+){3}\d+,\d)(\s) до \10\2

Для 5-го /7-го столбца:
аналогично приведенному выше, просто замените {3} на {4} /{6} в правиле соответственно

объяснение
1-е правило

Первое правило ,0 числам , Теперь все числа должны иметь ,\d .

2-е правило

2-е правило добавляет 0 к тем, кто состоит из одной цифры после запятой.

Что касается (?:): группы без захвата, предыдущие столбцы уже захвачены как \1 поэтому дополнительная запись не требуется.

Это только число чисел до 2 десятичных знаков. Чтобы дополнить произвольное количество, используйте pad excessively, then trim подход.

Последнее слово?
На мой взгляд, обычное регулярное выражение, как в notepad++, не подходит для этой задачи. Некоторые базовые сценарии, такие как bash или perl, могли бы справиться с этим с гораздо большей читабельностью.

5

Раздел 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-

Замените шаблон (одну цифру между двумя тире) тире, дополненный ноль, цифру и тире.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .