¿Qué es una expresión regular para una dirección MAC?

125

En este formato:

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

o:

3D-F2-C9-A6-B3-4F
Xaisoft
fuente

Respuestas:

266

El formato estándar (IEEE 802) para imprimir direcciones MAC-48 en forma amigable para los humanos es seis grupos de dos dígitos hexadecimales, separados por guiones -o dos puntos :.

Entonces:

^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$
netcoder
fuente
21
Tenga en cuenta que si se almacenan con letras hexadecimales en minúsculas, no coincidirá, cambie el grupo a [0-9A-Fa-f] para capturar ambos casos
Scott Chamberlain
55
probablemente también quieras ignorar la carcasa
dietbuddha
55
^ ([0-9A-Fa-f] {2} [: -]) {5} ([0-9A-Fa-f] {2}) $
Rajavel D
2
Como comentario aparte, la cita anterior sobre "formato estándar" proviene de Wikipedia, no del cuerpo de estándares 802.3. IEEE 802-2014 en realidad especifica guiones para direcciones MAC ordinarias (§ 8.1 ¶ 3) y dos puntos para la notación de bit invertido obsoleto (¶ 4). Es importante destacar que, en la práctica, nadie observa esto . Simplemente usamos uno u otro, pero nunca los mezclamos en un solo MAC escrito.
Pilcrow
1
No creo que este RegEx sea correcto, ya que también clasifica '3D-F2-C9: A6-B3: 4F' como una dirección MAC válida, aunque no sea correcta. El correcto sería: ((([[a-zA-z0-9] {2} [-:]) {5} ([a-zA-z0-9] {2})) | (([a- zA-z0-9] {2}:) {5} ([a-zA-z0-9] {2}))) Para que cada vez pueda elegir ':' o '-' para toda la dirección MAC.
PyFox
23

Un poco duro para los ojos, pero esto:

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

aplicará todos los dos puntos o todos los guiones para su notación MAC.

(Un enfoque de expresión regular más simple podría permitir A1:B2-C3:D4-E5:F6, por ejemplo, lo que rechaza lo anterior).

pilcrow
fuente
Esto funciona, pero ¿puedes explicar qué es xdigit? y noté que pones el grupo ([-:]) después de la longitud, ¿qué hace que eso tome todos los dos puntos o guiones?
Xaisoft
2
@Xaisoft, :xdigit:es la abreviatura de dígito hexadecimal, más o menos otra forma de decir [a-fA-F0-9]. Se \1refiere al grupo de captura para el primer guión o dos puntos ([-:]), y solo coincide con lo que coincidió esa primera vez.
Pilcrow el
2
1 para el uso de ambos grupos no captura captura y adecuada, y también para el uso :xdigit:(a pesar de que "abreviada" no ha hecho más corto que [a-fA-F0-9]y equivalentes /[a-f0-9]/ies más corta!)
GB96
@pilcrow ¿podría explicar por qué este mac: C8:FD:19:55:E6:3Afalla? Es una dirección mac real. Modifiqué tu expresión regular para aceptar :solo /^(?:[[:xdigit:]]{2}([:]))(?:[[:xdigit:]]{2}\1){4}[[:xdigit:]]{2}$/¡Gracias!
Sam
1
En mi opinión, esta es la mejor respuesta, ya que en realidad comprueba el uso mixto de ":" y "-".
Ray Oei
9

Esta expresión regular coincide con casi todos los formatos de Mac, incluido el formato de Cisco, como 0102-0304-abcd

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

Cadenas de ejemplo con las que coincide:

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

¡El formato mixto también coincidirá!

Vesselin Yanev
fuente
Esto coincidirá con los separadores después de cualquiera de los primeros cinco octetos, lo que significa que aceptará aa.aa.bbbb.cccc, por ejemplo.
Pilcrow
1
#notAllFormats Si tiene acceso a un sistema OSX con WiFi, ejecute /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -Iy busque la línea BSSID, si algún octeto está por debajo de 0x10, el cero inicial se descarta (¿ %xo %2xno se %02x printfutiliza el formato?)
nhed 9/17
8

delimitador: " : ", " - ", " . "

doble o simple: 00 = 0, 0f = f

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

o

/^([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 ...
cachorro de león
fuente
2
El segundo coincidirá incorrectamente con cadenas que contienen caracteres no hexadecimales como g.
Binary Phile
El segundo no es válido en la mayoría de los sabores, excepto BRE / ERE, que admite la clasificación de rango de caracteres. Sin embargo, el soporte para la clasificación del rango de caracteres varía según la implementación, por lo que el resultado puede variar.
nhahtdh
Otra cosa es que los grupos deben tener exactamente 2 dígitos hexadecimales.
nhahtdh
En teoría, todas las direcciones mac devueltas por programas en la naturaleza seguirían algún estándar como 2 dígitos hexadecimales en cada grupo separado. Sin embargo, algunas variantes de Unix no estandarizadas acortan la salida cuando hay un cero inicial, dejando solo 1 carácter hexadecimal en algunos casos. De ahí la necesidad de la {1,2}expresión regular
TrinitronX
Sin embargo, el conjunto de caracteres de [0-9a-F]probablemente debería reescribirse como:[0-9a-fA-F]
TrinitronX
5

Tenga en cuenta que la propiedad Unicode \p{xdigit}incluye las versiones FULLWIDTH. Quizás prefieras en su \p{ASCII_Hex_Digit}lugar.

La respuesta a la pregunta formulada podría ser la mejor respuesta, siempre que tenga un cierto módulo CPAN venerable instalado, escribiendo:

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

Muestro el patrón particular que muestra aquí como patrón de suerte número 13; Hay muchos otros.

Este programa:

#!/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

genera esta salida:

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

Que parece el tipo de cosa que estás buscando.

tchrist
fuente
5

Este enlace puede ayudarte. Puedes usar esto:(([0-9A-Fa-f]{2}[-:]){5}[0-9A-Fa-f]{2})|(([0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})

Manohar Bhattarai
fuente
4

Ver esta pregunta también.

Regexes de la siguiente manera:

^[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
fuente
1
¿No hay una manera de acortarlo haciendo grupos? y ¿cómo puedo combinar la expresión regular para tener a: o a - sin tener 2 expresiones regulares separadas?
Xaisoft
La forma abreviada que proporciona netcoder también funcionará. El uso de uno u otro puede basarse en si necesita capturar alguna de las direcciones MAC o simplemente validarla en general.
JYelton el
Debe validarse en general, por lo que si contiene todos los guiones o todos los dos puntos. Si contiene una mezcla, no es un MAC válido.
Xaisoft
2
@Xaisoft: Como dije en el comentario de mi respuesta, mezclar dos puntos y guiones es válido de acuerdo con la especificación.
netcoder
¿De qué fuente está obteniendo direcciones MAC que podrían tener una mezcla de delimitadores? Si provienen de una máquina / NIC real, es probable que no tenga ese problema. Si se trata de datos ingresados ​​por el usuario, simplemente realice un reemplazo de cadena para que todos los delimitadores sean consistentes.
JYelton el
2
/(?:[A-Fa-f0-9]{2}[:-]){5}(?:[A-Fa-f0-9]{2})/
bcosca
fuente
¿Es esto similar a la respuesta de Pilcrow, solo sin el: xdigit?
Xaisoft el
2

La versión de Python podría ser:

re.compile(r'\A(?:[\da-f]{2}[:-]){5}[\da-f]{2}\Z',re.I)
Juan Diego Godoy Robles
fuente
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})?$/

La expresión regular anterior valida todos los tipos de direcciones mac a continuación:

01-23-45-67-89-ab
01:23:45:67:89:ab
0123.4567.89ab
Mohammed Réda OUASSINI
fuente
Creo que este es el único completo y correcto.
Vincent Sels el
1

para desarrollador PHP

filter_var($value, FILTER_VALIDATE_MAC)
Saurabh Chandra Patel
fuente
1

No creo que el RegEx principal sea correcto, ya que también clasifica

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

como una dirección MAC válida, aunque no sea correcta. El correcto sería:

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

Para que cada vez pueda elegir ':' o '-' para toda la dirección MAC.

PyFox
fuente
0

Puede usar el siguiente procedimiento pasando la dirección mac para la validación,

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();             
}
Mandala Hari Babu
fuente
0

Gente PHP:

print_r(preg_match('/^(?:[0-9A-F]{2}[:]?){5}(?:[0-9A-F]{2}?)$/i', '00:25:90:8C:B8:59'));

Necesidad de explicación: http://regex101.com/r/wB0eT7

bn00d
fuente
0

Si necesita espacios entre números, como esta variante

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

La expresión regular cambia a

"^([0-9A-Fa-f]{2}\\s[:-]\\s){5}([0-9A-Fa-f]{2})$"
RexSplode
fuente
0

para que coincidan con las direcciones MAC EUI-48 de 48 bits y EUI-64 de 64 bits:

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

donde \ h es un carácter en [0-9a-fA-F]

o:

/\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/

esto permite '-' o ':' o ningún separador para ser utilizado

Tilo
fuente
0

Quizás lo más corto posible:

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

Actualización : existe una mejor manera de validar las direcciones MAC en PHP que admite direcciones MAC con guiones y con dos puntos. Use filter_var () :

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

Como sé, admite direcciones MAC en estas formas (x: un número hexadecimal):

xx:xx:xx:xx:xx:xx
xx-xx-xx-xx-xx-xx
xxxx.xxxx.xxxx
MAChitgarha
fuente
0

Muchas gracias a @Moshe por la excelente respuesta anterior. Después de investigar un poco más, me gustaría agregar mis hallazgos adicionales, tanto en lo que respecta a IEEE 802 como a imponer el uso de separadores consistentes en expresiones regulares.

El formato estándar (IEEE 802) para imprimir direcciones MAC-48 en forma amigable para los humanos es seis grupos de dos dígitos hexadecimales, separados por guiones . Sin embargo, es una convención ampliamente adoptada para permitir también dos puntos: y tres grupos de cuatro dígitos hexadecimales separados por puntos. .

Todo el crédito a @Moshe aquí por su declaración inicial, y a @pilcrow por señalar que IEEE 802 solo cubre bombo.

Aquí hay una expresión regular que impone que el mismo separador se use en toda la dirección mac:

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

Regex101 demo

Y aquí hay uno adicional que permite el uso de ningún separador:

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

Regex101 demo

Robert Axelsen
fuente
0

Como una dirección MAC puede tener 6 o 20 bytes (infiniband, ...) la respuesta correcta es:

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

puede reemplazar: con [: -.]? si quieres separadores diferentes o ninguno.

Olivier LAHAYE
fuente
-1

Este es pequeño:

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

Tenga en cuenta que esa extraña mezcla de varios caracteres o separadores podría pasar.

esguti
fuente
-4

la mejor respuesta es para regex de validación de dirección mac

^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$
Rittika Nagar
fuente