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
"зависит от редактора, который вы использовали.