Відповіді:
Стандартний формат (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)
Я не думаю, що основний 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
Дякую @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}))$
Оскільки MAC-адреса може бути 6 або 20 байтів (infiniband, ...) правильна відповідь:
^([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])$