Что такое регулярное выражение для MAC-адреса?

125

В таком формате:

3D:F2:C9:A6:B3:4F

или:

3D-F2-C9-A6-B3-4F
Xaisoft
источник

Ответы:

267

Стандартный (IEEE 802) формат для печати адресов MAC-48 в удобной для человека форме - это шесть групп из двух шестнадцатеричных цифр, разделенных дефисами -или двоеточиями :.

Так:

^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$
netcoder
источник
21
Обратите внимание, что если они хранятся с использованием строчных шестнадцатеричных букв, это не будет совпадать, измените группу на [0-9A-Fa-f], чтобы уловить оба случая,
Скотт Чемберлен
5
вы, вероятно, также хотите игнорировать корпус
Dietbuddha
5
^ ([0-9A-Fa-f] {2} [: -]) {5} ([0-9A-Fa-f] {2}) $
Rajavel D
2
Кроме того, приведенная выше цитата о «стандартном формате» взята из Википедии, а не из органа стандартов 802.3. IEEE 802-2014 фактически определяет дефисы для обычных MAC-адресов (§ 8.1 3) и двоеточия для устаревшей нотации с инверсией битов (4). Главное, что на практике этого никто не замечает . Мы просто используем один или другой, но никогда не смешиваем их в одном написанном MAC.
pilcrow
1
Я не думаю, что этот RegEx правильный, поскольку он также классифицирует «3D-F2-C9: A6-B3: 4F» как действительный MAC-адрес, хотя он и неверен. Правильным будет: ((([a-zA-z0-9] {2} [-:]) {5} ([a-zA-z0-9] {2})) | (([a- zA-z0-9] {2}:) {5} ([a-zA-z0-9] {2}))) Так что каждый раз вы можете выбирать ':' или '-' для всего MAC-адреса.
PyFox 05
23

Немного тяжеловато для глаз, но это:

/^(?:[[:xdigit:]]{2}([-:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/

будет применять либо все двоеточия, либо все тире для вашей нотации MAC.

(Более простой подход с использованием регулярных выражений может разрешить A1:B2-C3:D4-E5:F6, например, что вышеупомянутое отклоняет.)

знак абзаца
источник
Это работает, но вы можете объяснить, что такое xdigit? и я заметил, что вы поместили группу ([-:]) после длины, почему она принимает все двоеточия или дефисы?
Xaisoft
2
@Xaisoft :xdigit:- это сокращение от шестнадцатеричной цифры, более или менее другой способ сказать [a-fA-F0-9]. \1Относится к группе захвата для первого тире или двоеточия ([-:]), и соответствует только то , что соответствует , что в первый раз.
pilcrow
2
+1 за правильное использование как захватывающих, так и не захватывающих групп, а также за использование :xdigit:(даже при том, что это «сокращение» только короче, [a-fA-F0-9]а эквивалент /[a-f0-9]/iкороче!)
gb96
@pilcrow, не могли бы вы объяснить, почему этот Mac: C8:FD:19:55:E6:3Aне работает? Это настоящий MAC-адрес. Я изменил ваше регулярное выражение, чтобы принимать :только /^(?:[[:xdigit:]]{2}([:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/Спасибо!
Сэм
1
На мой взгляд, это лучший ответ, поскольку он фактически проверяет смешанное использование ":" и "-".
Ray
9

Это регулярное выражение соответствует практически всем форматам Mac, включая формат Cisco, например 0102-0304-abcd

^([[:xdigit:]]{2}[:.-]?){5}[[:xdigit:]]{2}$

Примеры строк, которым он соответствует:

01:02:03:04:ab:cd
01-02-03-04-ab-cd
01.02.03.04.ab.cd
0102-0304-abcd
01020304abcd

Смешанный формат также будет соответствовать!

Веселин Янев
источник
Это будет соответствовать разделителям после любого из первых пяти октетов, что означает aa.aa.bbbb.cccc, например , что он будет принимать .
pilcrow
1
#notAllFormats Если у вас есть доступ к системе OSX с Wi-Fi, запустите /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -Iи найдите строку BSSID, если какой-либо октет меньше 0x10, начальный ноль будет отброшен ( %xили %2xвместо %02x printfформата используется?)
nhed
8

разделитель: " : ", " - ", " . "

двойной или одинарный: 00 = 0, 0f = f

/^([0-9a-f]{1,2}[\.:-]){5}([0-9a-f]{1,2})$/i

или

/^([0-9a-F]{1,2}[\.:-]){5}([0-9a-F]{1,2})$/


exm: 00:27:0e:2a:b9:aa, 00-27-0E-2A-B9-AA, 0.27.e.2a.b9.aa ...
львенок
источник
2
Второй будет неправильно соответствовать строкам, которые содержат не шестнадцатеричные символы, такие как g.
Binary Phile
Второй недействителен в большинстве разновидностей, за исключением BRE / ERE, который поддерживает сопоставление диапазонов символов. Однако поддержка сопоставления диапазонов символов зависит от реализации, поэтому результат может отличаться.
nhahtdh
Другое дело, что в группах должно быть ровно 2 шестнадцатеричных цифры.
nhahtdh
Теоретически все MAC-адреса, возвращаемые программами в дикой природе, будут соответствовать некоторому стандарту, например, 2 шестнадцатеричных цифры в каждой отдельной группе. Однако некоторые нестандартизированные варианты Unix сокращают вывод, когда в начале стоит ноль, оставляя в некоторых случаях только 1 шестнадцатеричный символ. Отсюда и необходимость в {1,2}регулярном выражении
TrinitronX
Однако набор символов из, [0-9a-F]вероятно, следует переписать как:[0-9a-fA-F]
TrinitronX
5

Имейте в виду, что свойство Unicode \p{xdigit}включает версии FULLWIDTH. Вы могли бы предпочесть \p{ASCII_Hex_Digit}.

На заданный вопрос лучше всего ответить - при условии, что у вас установлен некий почтенный модуль CPAN - набрав:

% perl -MRegexp::Common -lE 'say $RE{net}{MAC}'

Я показываю конкретный образец, который он выводит здесь, как счастливый образец номер 13; есть много других.

Эта программа:

#!/usr/bin/env perl
use 5.010;
use strict;
use warnings qw<FATAL all>;

my $mac_rx = qr{
    ^ (?&MAC_addr) $
    (?(DEFINE)
        (?<MAC_addr>
                (?&pair) (?<it>  (?&either) )
            (?: (?&pair) \k<it> ) {4}
                (?&pair)
        )
        (?<pair>    [0-9a-f] {2} )
        (?<either>  [:\-]        )
    )
}xi;

while (<DATA>) {
    chomp;
    printf("%-25s %s\n", $_ => /$mac_rx/ ? "ok" : "not ok");
}

__END__
3D:F2:C9:A6:B3:4F
3D:F2:AC9:A6:B3:4F
3D:F2:C9:A6:B3:4F:00
:F2:C9:A6:B3:4F
F2:C9:A6:B3:4F
3d:f2:c9:a6:b3:4f
3D-F2-C9-A6-B3-4F
3D-F2:C9-A6:B3-4F

генерирует этот вывод:

3D:F2:C9:A6:B3:4F         ok
3D:F2:AC9:A6:B3:4F        not ok
3D:F2:C9:A6:B3:4F:00      not ok
:F2:C9:A6:B3:4F           not ok
F2:C9:A6:B3:4F            not ok
3d:f2:c9:a6:b3:4f         ok
3D-F2-C9-A6-B3-4F         ok
3D-F2:C9-A6:B3-4F         not ok

Это похоже на то, что вы ищете.

tchrist
источник
5

Эта ссылка может вам помочь. Вы можете использовать это:(([0-9A-Fa-f]{2}[-:]){5}[0-9A-Fa-f]{2})|(([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})

Манохар Бхаттарай
источник
4

См. Также этот вопрос .

Регулярные выражения следующим образом:

^[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}:[0-9A-F]{2}$

^[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}$
JYelton
источник
1
Разве нет способа сократить его, занимаясь группами? и как я могу объединить регулярное выражение, чтобы иметь: или - без двух отдельных регулярных выражений?
Xaisoft
Сокращенная форма, которую предоставляет сетевой кодер, также будет работать. Использование одного или другого может зависеть от того, нужно ли вам захватить какой-либо MAC-адрес или просто проверить его в целом.
JYelton
Его необходимо проверить в целом, поэтому, если он содержит все дефисы или все двоеточия. Если он содержит смесь, это недействительный MAC.
Xaisoft
2
@Xaisoft: Как я уже сказал в своем комментарии к ответу, смешивание двоеточий и дефисов допустимо в соответствии со спецификацией.
netcoder
Из какого источника вы получаете MAC-адреса, которые могут иметь набор разделителей? Если они поступают с реальной машины / сетевой карты, у вас, скорее всего, не будет этой проблемы. Если это данные, введенные пользователем, просто выполните замену строки, чтобы все разделители согласовывались.
JYelton
2
/(?:[A-Fa-f0-9]{2}[:-]){5}(?:[A-Fa-f0-9]{2})/
bcosca
источник
Это похоже на ответ Pilcrow, только без: xdigit?
Xaisoft
2

Версия python может быть:

re.compile(r'\A(?:[\da-f]{2}[:-]){5}[\da-f]{2}\Z',re.I)
Хуан Диего Годой Роблес
источник
2
/^(([a-fA-F0-9]{2}-){5}[a-fA-F0-9]{2}|([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}|([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})?$/

Регулярное выражение выше проверяет все типы MAC-адресов ниже:

01-23-45-67-89-ab
01:23:45:67:89:ab
0123.4567.89ab
Мохаммед Реда УАССИНИ
источник
Думаю, это единственное, что полностью и правильно.
Винсент Селс
1

для PHP разработчика

filter_var($value, FILTER_VALIDATE_MAC)
Саураб Чандра Патель
источник
1

Большое спасибо @Moshe за отличный ответ выше. Проведя еще несколько исследований, я хотел бы добавить свои дополнительные результаты, как в отношении IEEE 802, так и в отношении обеспечения согласованного использования разделителя в регулярном выражении.

Стандартный (IEEE 802) формат для печати адресов MAC-48 в удобной для человека форме - это шесть групп из двух шестнадцатеричных цифр, разделенных дефисами - . Однако широко распространено соглашение, разрешающее также двоеточие: и три группы из четырех шестнадцатеричных цифр, разделенных точками. ,

Полная благодарность @Moshe за его первоначальное заявление и @pilcrow за указание на то, что IEEE 802 распространяется только на обман.

Вот регулярное выражение, которое применяет тот же разделитель во всем MAC-адресе:

^(?:(?:[0-9A-Fa-f]{2}(?=([-:]))(?:\1[0-9A-Fa-f]{2}){5}))$

Regex101 демо

А вот еще один, который позволяет вообще не использовать разделитель:

^(?:(?:[0-9A-Fa-f]{2}(?=([-:]|))(?:\1[0-9A-Fa-f]{2}){5}))$

Regex101 демо

Роберт Аксельсен
источник
1

Я не думаю, что основной RegEx правильный, поскольку он также классифицирует

'3D-F2-C9:A6-B3:4F' 

как действительный MAC-адрес, даже если он неверен. Правильным будет:

((([a-zA-z0-9]{2}[-:]){5}([a-zA-z0-9]{2}))|(([a-zA-z0-9]{2}:){5}([a-zA-z0-9]{2})))

Так что каждый раз вы можете выбрать «:» или «-» для всего MAC-адреса.

PyFox
источник
0

Вы можете использовать следующую процедуру, передав MAC-адрес для проверки,

private static final String MAC_PATTERN = "^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$";

private boolean validateMAC(final String mac){          
    Pattern pattern = Pattern.compile(MAC_PATTERN);
    Matcher matcher = pattern.matcher(mac);
    return matcher.matches();             
}
Хари Бабу Мандала
источник
0

Если вам нужны пробелы между числами, как в этом варианте

3D : F2 : C9 : A6 : B3 : 4F

Регулярное выражение изменится на

"^([0-9A-Fa-f]{2}\\s[:-]\\s){5}([0-9A-Fa-f]{2})$"
RexSplode
источник
0

для соответствия 48-битным MAC-адресам EUI-48 и 64-битным EUI-64:

/\A\h{2}([:\-]?\h{2}){5}\z|\A\h{2}([:\-]?\h{2}){7}\z/

где \ h - символ в [0-9a-fA-F]

или:

/\A[0-9a-fA-F]{2}([:\-]?[0-9a-fA-F]{2}){5}\z|\A[0-9a-fA-F]{2}([:\-]?[0-9a-fA-F]{2}){7}\z/

это позволяет использовать '-' или ':' или не использовать разделитель

Тило
источник
0

Может быть, самый короткий:

/([\da-f]{2}[:-]){5}[\da-f]{2}/i

Обновление : существует лучший способ проверки MAC-адресов в PHP, который поддерживает MAC-адреса в стиле дефис и двоеточие. Используйте filter_var () :

// Returns $macAddress, if it's a valid MAC address
filter_var($macAddress, FILTER_VALIDATE_MAC);

Насколько я знаю, он поддерживает MAC-адреса в следующих формах (x: шестнадцатеричное число):

xx:xx:xx:xx:xx:xx
xx-xx-xx-xx-xx-xx
xxxx.xxxx.xxxx
MAChitgarha
источник
0

Поскольку MAC-адрес может быть 6 или 20 байтов (бесконечная строка, ...), правильный ответ:

^([0-9A-Fa-f]{2}:){5}(([0-9A-Fa-f]{2}:){14})?([0-9A-Fa-f]{2})$

вы можете заменить: на [: -.]? если вам нужны разные разделители или нет.

Оливье Лахай
источник
-1

Это маленький:

(([0-9A-F]{2}[:-]?){6})

Имейте в виду, что это странное сочетание нескольких символов или разделителей могло пройти.

esguti
источник
-4

лучший ответ - для регулярного выражения проверки MAC-адреса

^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$
Риттика Нагар
источник