我已经编写了一个基于RegEx的VIN验证数,但是当我尝试运行一些测试时,它并不接受一些有效的VIN编号。
My RegEx:
^[A-HJ-NPR-Za-hj-npr-z\\d]{8}[\\dX][A-HJ-NPR-Za-hj-npr-z\\d]{2}\\d{6}$VIN号码不起作用:
1 ftfw1et4bfc45903
WP0ZZZ99ZTS392124
VIN Number工作:
19uya 315811000000
1 hwa31a5ae006086
(我认为问题发生在结尾的数字,维基百科让它听起来好像只有6个数字,而那个数字不起作用,但有效的数字只有5结尾)
任何帮助纠正这一问题将是非常感谢!
发布于 2015-05-19 00:37:23
我不能帮你找到一个完美的VIN数字的正则表达式--但是我可以解释为什么这个在你的1ftfw1et4bfc45903例子中失败了
^[A-HJ-NPR-Za-hj-npr-z\d]{8}[\dX][A-HJ-NPR-Za-hj-npr-z\d]{2}\d{6}$解释:
^[A-HJ-NPR-Za-hj-npr-z\d]{8}
这允许有8个字符,由除I、O和q以外的任何数字和任何字母组成;它正确地找到前8个字符:
1 ftfw1et[\dX]
这允许一个字符,一个数字或一个大写X;它正确地找到下一个字符:
4[A-HJ-NPR-Za-hj-npr-z\d]{2}
这允许有两个字符,由任意数字和除I、O和q以外的任何字母组成;它正确地查找后面的两个字符:
bf\d{6}$
这正好允许6位数字,也是regex失败的原因;因为最后的6个字符不是全部数字:
c45903发布于 2018-08-24 02:20:05
丹是对的-文斯有一个校验和。你不能在regex中利用它,所以你能做的最好的方法就是把网拉得太宽了,我的意思是你的正则表达式会接受所有有效的VINs,还有大约1万亿(粗略估计)的非VIN 17字符字符串。
如果您使用的是一种使用命名捕获组的语言,也可以提取该数据。
所以,如果你的目标是:
[A-HJ-NPR-Z0-9]{17}。/^(?<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}))$/,在这个答案的末尾定义名称。捕获组名称密钥:
wmi -世界制造商标识符vds -车辆描述符部分check -校验数字vis -车辆标识符部分year -模型年plant -植物代码seq -生产序列号发布于 2018-02-06 14:36:12
这个正则表达式可以很好地验证美国VINs,包括您描述的那个:
A-HJ-NPR-Z0-9{17}
记住用标志i对大小写不敏感。
https://stackoverflow.com/questions/30314850
复制相似问题