我已根据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结尾)
任何帮助非常感谢您纠正此问题!
答案 0 :(得分:11)
我无法帮助您获得VIN数字的完美正则表达式 - 但我可以解释为什么在 1ftfw1et4bfc45903 的示例中这个失败了:< / p>
^[A-HJ-NPR-Za-hj-npr-z\d]{8}
[\dX]
[A-HJ-NPR-Za-hj-npr-z\d]{2}
\d{6}$
答案 1 :(得分:4)
VIN 应仅包含A-Z
,0-9
个字符,但不应包含I
,O
或Q
>
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
使其不区分大小写答案 3 :(得分:3)
我觉得正则表达式不是理想的验证。 VIN具有内置的校验位。 https://en.wikibooks.org/wiki/Vehicle_Identification_Numbers_(VIN_codes)/Check_digit或http://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年以后的模型年份。
希望有帮助。
答案 7 :(得分:0)
请使用这个正则表达式。它更短,适用于所有 VIN 类型
(?=.*\d|[A-Z])(?=.*[A-Z])[A-Z0-9]{17}
我用下面的新公式改变了上面的公式
(?=.*\d|=.*[A-Z])(?=.*[A-Z])[A-Z0-9]{17}
这个正则表达式考虑任何字母,但至少一位,最多 17 个字符