VIN验证RegEx

时间:2015-05-19 00:26:14

标签: regex validation

我已根据http://en.wikipedia.org/wiki/Vehicle_identification_number编写了一个VIN验证RegEx,但是当我尝试运行某些测试时,它不接受一些有效的VIN编号。

我的RegEx:

^[A-HJ-NPR-Za-hj-npr-z\\d]{8}[\\dX][A-HJ-NPR-Za-hj-npr-z\\d]{2}\\d{6}$

VIN号码不起作用:
1ftfw1et4bfc45903
WP0ZZZ99ZTS392124

VIN号码工作:
19uya31581l000000
1hwa31aa5ae006086

(我认为问题出现在最后的数字,维基百科听起来像它只有6个数字结束,而一个不工作,但有效数字只以5结尾)

任何帮助非常感谢您纠正此问题!

8 个答案:

答案 0 :(得分:11)

我无法帮助您获得VIN数字的完美正则表达式 - 但我可以解释为什么在 1ftfw1et4bfc45903 的示例中这个失败了:< / p>

  • ^[A-HJ-NPR-Za-hj-npr-z\d]{8}
    这允许8个字符,由任何数字和除 I O Q 之外的任何字母组成;它正确找到前8个字符:
    1ftfw1et
  • [\dX]
    这允许1个字符,数字或大写 X ;它正确找到下一个字符:
    4
  • [A-HJ-NPR-Za-hj-npr-z\d]{2}
    这允许2个字符,由任何数字和除I,O和Q之外的任何字母组成;它正确找到接下来的两个字符:
    BF
  • \d{6}$
    这允许正好6位数,这是正则表达式失败的原因;因为最后6个字符不是全部数字:
    c45903

答案 1 :(得分:4)

VIN 应仅包含A-Z0-9个字符,但不应包含IOQ VIN 的最后6个字符应为数字
VIN 应为17个字符

您没有指定您正在使用哪种语言,但以下正则表达式可用于使用php验证美国VIN

/^(?:([A-HJ-NPR-Z]){3}|\d{3})(?1){2}\d{2}(?:(?1)|\d)(?:\d|X)(?:(?1)+\d+|\d+(?1)+)\d{6}$/i

答案 2 :(得分:3)

此正则表达式可用于验证美国VIN,包括您描述的VIN:

<强> [A-HJ-NPR-Z0-9] {17}

请记住使用标志i

使其不区分大小写

来源:https://github.com/rfink/angular-vin

答案 3 :(得分:3)

我觉得正则表达式不是理想的验证。 VIN具有内置的校验位。 https://en.wikibooks.org/wiki/Vehicle_Identification_Numbers_(VIN_codes)/Check_digithttp://www.vsource.org/VFR-RVF_files/BVINcalc.htm

我建议你使用它来构建算法。 (Untested algorithm example)

答案 4 :(得分:1)

这应该有效,它来自splunk搜索,因此还有一些额外的排除**

(?i)(?<VIN>[A-Z0-9^IOQioq_]{11}\d{6})

答案 5 :(得分:1)

Dan是正确的-VIN具有校验和。您不能在正则表达式中使用它,因此您可以使用正则表达式进行的最大操作就是投射太大的网。这是指您的正则表达式将接受所有有效的VIN,并且也将接受大约一万亿个VIN。 (粗略估算)非VIN 17个字符的字符串。

如果您使用的是具有命名捕获组的语言,则也可以提取该数据。

因此,如果您的目标是:

  • 不拒绝有效的VIN(可以输入无效的VIN),然后使用Fransisco的答案[A-HJ-NPR-Z0-9]{17}

  • 不拒绝有效的VIN,并获取模型年份,工厂代码等信息,然后使用它(请注意,您必须使用支持命名捕获组的语言-Perl, Python,Elixir,几乎可以肯定是其他人,但不是JS):/^(?<wmi>[A-HJ-NPR-Z\d]{3})(?<vds>[A-HJ-NPR-Z\d]{5})(?<check>[\dX])(?<vis>(?<year>[A-HJ-NPR-Z\d])(?<plant>[A-HJ-NPR-Z\d])(?<seq>[A-HJ-NPR-Z\d]{6}))$/,其中名称在此答案的末尾定义。

  • 不拒绝有效的VIN,并防止某些但不是全部无效的VIN,您可以像Pedro一样获得具体信息。

  • 接受有效的VIN:您需要编写代码(开玩笑,GitHub exists)。

捕获组名称键:

  • wmi-世界制造商标识符
  • vds-车辆描述符部分
  • check-校验位
  • vis-车辆识别符部分
  • year-车型年
  • plant-工厂代码
  • seq-生产序列号

答案 6 :(得分:0)

如果您有兴趣,NHTSA网站提供了用于计算第9个字符校验和的方法。它还提供了许多其他有用的数据,例如允许在哪个位置使用哪个字符,或者如何确定第10个字符(如果按字母顺序)是指1999年之前的模型年份还是2010年以后的模型年份。

NHTSA VIN eCFR

希望有帮助。

答案 7 :(得分:0)

请使用这个正则表达式。它更短,适用于所有 VIN 类型

(?=.*\d|[A-Z])(?=.*[A-Z])[A-Z0-9]{17}

我用下面的新公式改变了上面的公式

(?=.*\d|=.*[A-Z])(?=.*[A-Z])[A-Z0-9]{17}

这个正则表达式考虑任何字母,但至少一位,最多 17 个字符