首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VIN验证RegEx

VIN验证RegEx
EN

Stack Overflow用户
提问于 2015-05-19 00:26:14
回答 7查看 41.1K关注 0票数 23

我已经编写了一个基于RegEx的VIN验证,但是当我尝试运行一些测试时,它并不接受一些有效的VIN编号。

My RegEx:

代码语言:javascript
复制
^[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结尾)

任何帮助纠正这一问题将是非常感谢!

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2015-05-19 00:37:23

我不能帮你找到一个完美的VIN数字的正则表达式--但是我可以解释为什么这个在你的1ftfw1et4bfc45903例子中失败了

代码语言:javascript
复制
^[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
票数 21
EN

Stack Overflow用户

发布于 2018-08-24 02:20:05

丹是对的-文斯有一个校验和。你不能在regex中利用它,所以你能做的最好的方法就是把网拉得太宽了,我的意思是你的正则表达式会接受所有有效的VINs,还有大约1万亿(粗略估计)的非VIN 17字符字符串。

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

所以,如果你的目标是:

  • 只有不拒绝有效的VINs (让无效的VINs是可以的),然后使用Fransisco的答案,[A-HJ-NPR-Z0-9]{17}
  • 不要拒绝有效的VINs,并获取诸如模型年、植物代码等信息,然后使用它(请注意,您必须使用一种能够支持命名捕获组的语言--从我的头顶: 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}))$/,在这个答案的末尾定义名称。
  • 不拒绝有效的VINs,并防止一些但不是所有无效VINs,您可以像Pedro那样获得特定的信息。
  • 只接受有效的VINs:您需要编写代码(开玩笑,GitHub存在)。

捕获组名称密钥:

  • wmi -世界制造商标识符
  • vds -车辆描述符部分
  • check -校验数字
  • vis -车辆标识符部分
  • year -模型年
  • plant -植物代码
  • seq -生产序列号
票数 13
EN

Stack Overflow用户

发布于 2018-02-06 14:36:12

这个正则表达式可以很好地验证美国VINs,包括您描述的那个:

A-HJ-NPR-Z0-9{17}

记住用标志i对大小写不敏感。

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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30314850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档