2015-05-28 2 views
2

У меня есть строка, которая представляет 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? В качестве альтернативы, есть ли регулярное выражение, которое я не думаю об этом, можно использовать здесь? Или мне действительно нужно использовать многострочный подход (например, разделение строк и повторение, используя указанное выше регулярное выражение несколько раз, пока результат не будет таким же, как и вход и т. Д.).

ответ

2

Попробуйте это:

String replaced = original.replaceAll("\\b\\w:", "0$0"); 

\b является "граница слова", так \b\w будет соответствовать слово характер (письмо или nu mber) в начале ввода, а также после двоеточия. $0 (обратная ссылка) на весь матч. Не страшно взгляд обходные :)


Некоторые тест-код:

String original = "0:1b:17:0:b:31"; 
String replaced = original.replaceAll("\\b\\w:", "0$0"); 
System.out.println(replaced); 

Выход:

00:1b:17:00:0b:31 
+0

Вы должны заменить '\ б ([\ да-е]) (? = :) 'с' 0 $ 0' – naomik

+1

hahaha 'No scary look arounds:)' – vks

+0

Хорошо, тогда '\ b ([\ da-f]):' с '0 $ 0:' then ... – naomik

1

Вы можете использовать:

String replaced = original.replaceAll("\\b(?=[\\da-fA-F]\\b)", "0"); 

RegEx Demo

Смежные вопросы