¿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

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})$

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).


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á!


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 ...

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.


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})


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}$

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})/

¿Es esto similar a la respuesta de Pilcrow, solo sin el: xdigit?
— Xaisoft el


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

Creo que este es el único completo y correcto.
— Vincent Sels el


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.


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();             
}


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})$"

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


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

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


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.


-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.


-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])$
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.