У меня есть строка, которая представляет MAC-адрес, но не показывает байт более высокого порядка для каждого адреса, если он равен нулю. То есть вместо адреса формы 00:11:22:33:44:55
, у меня бы был адрес формы 0:11:22:33:44:55
; вместо адреса формы 00:1b:17:00:0b:31
, он имеет форму 0:1b:17:0:b:31
.Явное регулярное выражение Java для нормализации MAC-адреса
Я хотел бы преобразовать строку, в которой отсутствует старший байт MAC-адреса (если этот старший байт равен нулю) в строку, которая явно включает в себя его старший байт. Очевидно, я мог бы разбить входящую строку на :
, а затем пройти через каждый элемент. Но я думал, что это может быть чище/быстрее сделать это с регулярным выражением (в частности, метод string replaceAll). Однако регулярное выражение, которое я написал, не работает. В качестве примера,
String original = "0:1b:17:0:b:31";
String replaced = original.replaceAll("(^|:)([0-9a-f])(:|$)","$10$2$3");
System.out.println(replaced);
отпечатки 00:1b:17:00:b:31
. По сути, он пропускает вставку байта более высокого порядка за последние b
. Я думаю, что это связано с тем, что регулярное выражение, которое я использую, имеет совпадающие совпадения: двоеточие, используемое для разграничения конца одного совпадения, также должно использоваться для разграничения начала следующего совпадения, если есть две или более записи, отсутствующие в высоком порядке байт.
Есть ли способ разрешить совпадение совпадений с использованием регулярных выражений Java? В качестве альтернативы, есть ли регулярное выражение, которое я не думаю об этом, можно использовать здесь? Или мне действительно нужно использовать многострочный подход (например, разделение строк и повторение, используя указанное выше регулярное выражение несколько раз, пока результат не будет таким же, как и вход и т. Д.).
Вы должны заменить '\ б ([\ да-е]) (? = :) 'с' 0 $ 0' – naomik
hahaha 'No scary look arounds:)' – vks
Хорошо, тогда '\ b ([\ da-f]):' с '0 $ 0:' then ... – naomik