Регулярное выражение для нормализации (заполнение нулями) IP-адресов - PullRequest
4 голосов
/ 28 июля 2010

У меня есть копия файла журнала, которую я хочу, чтобы ее было легче просматривать / редактировать.
Я использую текстовую панель для удаления ненужных материалов, и я могу ввести регулярное выражение в качестве поискового запроса и использовать \ 1. \ 2. \ 3. \ 4 в поле назначения для захваченных групп.
Я хотел бы изменить все IP-адреса, которые начинаются с каждой строки с

[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

до

[0-9]{3}\.[0-9]{3}\.[0-9]{3}\.[0-9]{3}

с дополняющими начальными нулями Как это сделать за один раз?

Пример ввода:

10.2.123.4
110.12.23.40
123.123.123.123
1.2.3.4

пример вывода

010.002.123.004
110.012.023.040
123.123.123.123
001.002.003.004

Смотрите мой собственный ответ, что работает

Спасибо за ваш вклад

Ответы [ 3 ]

2 голосов
/ 28 июля 2010

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

Обратите внимание, что на каждой находке есть пробел и каждая замена

^([0-9]{1})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3}) -> 00\1.\2.\3.\4 
^([0-9]{2})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3}) -> 0\1.\2.\3.\4 

^([0-9]{3})\.([0-9]{1})\.([0-9]{1,3})\.([0-9]{1,3}) -> \1.00\2.\3.\4 
^([0-9]{3})\.([0-9]{2})\.([0-9]{1,3})\.([0-9]{1,3}) -> \1.0\2.\3.\4 

^([0-9]{3})\.([0-9]{3})\.([0-9]{1})\.([0-9]{1,3}) -> \1.\2.00\3.\4 
^([0-9]{3})\.([0-9]{3})\.([0-9]{2})\.([0-9]{1,3}) -> \1.\2.0\3.\4 

^([0-9]{3})\.([0-9]{3})\.([0-9]{3})\.([0-9]{1}) -> \1.\2.\3.00\4 
^([0-9]{3})\.([0-9]{3})\.([0-9]{3})\.([0-9]{2}) -> \1.\2.\3.0\4 

Синтаксис текстовой панели:

^\([0-9]\{1\}\)\.\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\) -> 00\1.\2.\3.\4 
^\([0-9]\{2\}\)\.\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\) -> 0\1.\2.\3.\4 

^\([0-9]\{3\}\)\.\([0-9]\{1\}\)\.\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\) -> \1.00\2.\3.\4 
^\([0-9]\{3\}\)\.\([0-9]\{2\}\)\.\([0-9]\{1,3\}\)\.\([0-9]\{1,3\}\) -> \1.0\2.\3.\4 

^\([0-9]\{3\}\)\.\([0-9]\{3\}\)\.\([0-9]\{1\}\)\.\([0-9]\{1,3\}\) -> \1.\2.00\3.\4 
^\([0-9]\{3\}\)\.\([0-9]\{3\}\)\.\([0-9]\{2\}\)\.\([0-9]\{1,3\}\) -> \1.\2.0\3.\4 

^\([0-9]\{3\}\)\.\([0-9]\{3\}\)\.\([0-9]\{3\}\)\.\([0-9]\{1\}\) -> \1.\2.\3.00\4 
^\([0-9]\{3\}\)\.\([0-9]\{3\}\)\.\([0-9]\{3\}\)\.\([0-9]\{2\}\) -> \1.\2.\3.0\4 
2 голосов
/ 16 февраля 2015

Не совсем полный, один лайнер, который вы хотите, но он по крайней мере сводит его к двум строкам вместо ваших текущих 8.

После того же формата, который вы использовали в своем ответе:

^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3}) -> 00\1.00\2.00\3.00\4

^0*([0-9]{3})\.0*([0-9]{3})\.0*([0-9]{3})\.0*([0-9]{3}) -> \1.\2.\3.\4

Это работает так:

  1. он дополняет все числа так, чтобы в каждом разделе было не менее 3 чисел
  2. он вытаскивает ровно 3 числа из каждого раздела и игнорирует все оставшиеся начальные 0
1 голос
/ 28 июля 2010

Плюнь на ".", колодки, присоединяйся.Нет необходимости в регулярных выражениях.Regex не принесет никакой выгоды, даже.

JavaScript, например:

var ip = "110.12.23.40";

ip = ip.split(".").map( function(i) {
  return ("00"+i).slice(-3);
}).join(".");

alert(ip);  // 110.012.023.040
...