Regex: добавить пробелы для форматирования поля

У меня есть этот вход:

P_200:E2:0.0200

Мне нужен этот вывод:

P_200                   E2  0.0200

То есть первое ":" заменяется пробелами, так что общая длина поля составляет 24 символа, а второе ":" заменяется на "\t"

Я могу выбрать и заменить последний ":", используя что-то вроде:

:(?=[^:]*$)

Я также могу выбрать деталь до первого ":", используя что-то вроде:

^[^:]+:

но я понятия не имею, как заменить его так, чтобы он был отформатирован и имел 24 символа (лишние заполнены пробелами)

2 ответа

Notepad++

Используя N++, это можно сделать с одним регулярным выражением и строкой замены, но нажатием кнопки " заменить все" два раза:

Regex:

^(?(?![^:]{24})([^:]*):([^:]*):|(.{24})[^:]*)

Объяснение:

^                 # Match start of input string
(?                # Start of conditional statement (cs:1)
    (?![^:]{24})    # If there isn't 24 characters before colon
    ([^:]*):        # Capture 1st field value and next colon
    ([^:]*):        # Capture 2nd field value and next colon
    |               # Else
    (.{24})[^:]*    # Capture 1st 24 chars and match extra ones
)                 # End of conditional statement (cs:1)

Заменить:

(?1\1                        \:\2\t:\3)

Это выгодно от условных замен синтаксиса строки BEF. Если существует первая группа захвата, строка замены будет \1 \:\2\t между 24 пробелами, в противном случае он будет заменен обратной ссылкой на третью группу захвата. \3

Возвышенный текст

В Sublime Text необходимо выполнить два шага поиска / замены:

Шаг 1

Найти то, что:

^(?(?![^:]{24})([^:]*):([^:]*):)

Заменить:

\1                        :\2\t

Шаг 2

Найти то, что:

^(.{24})[^:]*

Заменить:

\1

Если вы используете Python:

import re
text = 'P_200:E2:0.0200'
print(re.sub(r'^(.+?):(.+?):(.+?)$', '\g<1>' + ' ' * 24 + '\g<2>\t\g<3>', text))

С sed:

echo "P_200:E2:0.0200" | sed 's/^\(.\+\?\):\(.\+\?\):\(.\+\?\)$/\1                        \2\t\3/g'

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

Поиск: (.+?):(.+?):(.+?)Заменить на: \1 \2\t\3

Числовые заполнители "\1","\2" а также "\3"Иногда в другом формате, как"$1","$2" а также "$3"зависит от редактора, который вы использовали.

Другие вопросы по тегам