La guía o código que hallarás en este post es la solución más fácil y válida que hallamos a tu duda o problema.
Solución:
No puedo ayudarlo con una expresión regular perfecta para los números VIN, pero puede explique por qué este está fallando en su ejemplo de 1ftfw1et4bfc45903:
^[A-HJ-NPR-Za-hj-npr-zd]8[dX][A-HJ-NPR-Za-hj-npr-zd]2d6$
Explicación:
^[A-HJ-NPR-Za-hj-npr-zd]8
Esto permite 8 caracteres, compuestos de dígitos y letras excepto yo, Oy q; encuentra correctamente los primeros 8 caracteres:
1ftfw1et[dX]
Esto permite 1 carácter, ya sea un dígito o una mayúscula X; encuentra correctamente el siguiente carácter:
4[A-HJ-NPR-Za-hj-npr-zd]2
Esto permite 2 caracteres, compuestos por cualquier dígito y cualquier letra excepto I, O y Q; encuentra correctamente los siguientes 2 caracteres:
noviod6$
Esto permite exactamente 6 dígitos, y es la razón por la que falla la expresión regular; porque los últimos 6 caracteres no son todos dígitos:
c45903
VIN debería tener sólo A-Z
, 0-9
personajes, pero no I
, O
o Q
Últimos 6 caracteres de VIN debería ser un número
VIN debe tener 17 caracteres
No especificó qué idioma está usando, pero la siguiente expresión regular se puede usar para validar un VIN de EE. UU. con php
:
/^(?:([A-HJ-NPR-Z])3|d3)(?1)2d2(?:(?1)|d)(?:d|X)(?:(?1)+d+|d+(?1)+)d6$/i
Dan tiene razón: los VIN tienen una suma de verificación. No puedes utilizar eso en expresiones regulares, así que lo mejor que puedes hacer con expresiones regulares es lanzar una red demasiado amplia. Con eso quiero decir que su expresión regular aceptará todos los VIN válidos, y también alrededor de un billón (estimación aproximada) de cadenas de 17 caracteres que no sean VIN.
Si está trabajando en un idioma con grupos de captura con nombre, también puede extraer esos datos.
Entonces, si tu objetivo es:
-
Solo para no rechace VIN válidos (dejar entrar los no válidos está bien) luego usa la respuesta de Francisco,
[A-HJ-NPR-Z0-9]17
. -
No rechace los VIN válidos y tome información como el año del modelo, el código de la planta, etc., luego use esto (tenga en cuenta que debe usar un lenguaje que pueda admitir grupos de captura con nombre, fuera de mi cabeza: Perl, Python, Elixir, casi seguro otros pero no JS):
/^(?
donde los nombres se definen al final de esta respuesta.[A-HJ-NPR-Zd]3)(? [A-HJ-NPR-Zd]5)(? [dX])(? (? [A-HJ-NPR-Zd])(? [A-HJ-NPR-Zd])(? [A-HJ-NPR-Zd]6))$/ -
No rechazar VIN válidos y evitar algunos pero no todos VIN no válidos, puede obtener información específica como lo hace Pedro.
-
Solamente acepte VIN válidos: necesita escribir código (es broma, GitHub existe).
Nombre del grupo de captura key:
wmi
– Identificador mundial del fabricantevds
– Sección de descripción del vehículocheck
– Dígito de controlvis
– Sección de identificación del vehículoyear
– Año del modeloplant
– Código de plantaseq
– Número de secuencia de producción