Ответы:
Стандартный (IEEE 802) формат для печати адресов MAC-48 в удобной для человека форме - это шесть групп из двух шестнадцатеричных цифр, разделенных дефисами
-
или двоеточиями:
.
Так:
^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$
Немного тяжеловато для глаз, но это:
/^(?:[[:xdigit:]]{2}([-:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/
будет применять либо все двоеточия, либо все тире для вашей нотации MAC.
(Более простой подход с использованием регулярных выражений может разрешить A1:B2-C3:D4-E5:F6
, например, что вышеупомянутое отклоняет.)
:xdigit:
- это сокращение от шестнадцатеричной цифры, более или менее другой способ сказать [a-fA-F0-9]
. \1
Относится к группе захвата для первого тире или двоеточия ([-:])
, и соответствует только то , что соответствует , что в первый раз.
:xdigit:
(даже при том, что это «сокращение» только короче, [a-fA-F0-9]
а эквивалент /[a-f0-9]/i
короче!)
C8:FD:19:55:E6:3A
не работает? Это настоящий MAC-адрес. Я изменил ваше регулярное выражение, чтобы принимать :
только /^(?:[[:xdigit:]]{2}([:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/
Спасибо!
Это регулярное выражение соответствует практически всем форматам 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
, например , что он будет принимать .
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I
и найдите строку BSSID, если какой-либо октет меньше 0x10, начальный ноль будет отброшен ( %x
или %2x
вместо %02x
printf
формата используется?)
разделитель: " : ", " - ", " . "
двойной или одинарный: 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 ...
{1,2}
регулярном выражении
[0-9a-F]
вероятно, следует переписать как:[0-9a-fA-F]
Имейте в виду, что свойство 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
Это похоже на то, что вы ищете.
Эта ссылка может вам помочь. Вы можете использовать это:(([0-9A-Fa-f]{2}[-:]){5}[0-9A-Fa-f]{2})|(([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{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}$
Версия python может быть:
re.compile(r'\A(?:[\da-f]{2}[:-]){5}[\da-f]{2}\Z',re.I)
/^(([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
для PHP разработчика
filter_var($value, FILTER_VALIDATE_MAC)
Большое спасибо @Moshe за отличный ответ выше. Проведя еще несколько исследований, я хотел бы добавить свои дополнительные результаты, как в отношении IEEE 802, так и в отношении обеспечения согласованного использования разделителя в регулярном выражении.
Стандартный (IEEE 802) формат для печати адресов MAC-48 в удобной для человека форме - это шесть групп из двух шестнадцатеричных цифр, разделенных дефисами - . Однако широко распространено соглашение, разрешающее также двоеточие: и три группы из четырех шестнадцатеричных цифр, разделенных точками. ,
Полная благодарность @Moshe за его первоначальное заявление и @pilcrow за указание на то, что IEEE 802 распространяется только на обман.
Вот регулярное выражение, которое применяет тот же разделитель во всем MAC-адресе:
^(?:(?:[0-9A-Fa-f]{2}(?=([-:]))(?:\1[0-9A-Fa-f]{2}){5}))$
А вот еще один, который позволяет вообще не использовать разделитель:
^(?:(?:[0-9A-Fa-f]{2}(?=([-:]|))(?:\1[0-9A-Fa-f]{2}){5}))$
Я не думаю, что основной 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-адреса.
Вы можете использовать следующую процедуру, передав 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();
}
Люди PHP:
print_r(preg_match('/^(?:[0-9A-F]{2}[:]?){5}(?:[0-9A-F]{2}?)$/i', '00:25:90:8C:B8:59'));
Требуется объяснение: http://regex101.com/r/wB0eT7
для соответствия 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/
это позволяет использовать '-' или ':' или не использовать разделитель
Может быть, самый короткий:
/([\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
Поскольку MAC-адрес может быть 6 или 20 байтов (бесконечная строка, ...), правильный ответ:
^([0-9A-Fa-f]{2}:){5}(([0-9A-Fa-f]{2}:){14})?([0-9A-Fa-f]{2})$
вы можете заменить: на [: -.]? если вам нужны разные разделители или нет.
лучший ответ - для регулярного выражения проверки MAC-адреса
^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$