0

我正在尝试使用可以捕获任何 1980 年之前的 VIN(车辆识别号)的 RegEx。Anythign pre 1980's 不需要是 17 位数字,可以包含“O”和“U”。

该网站声称有一个正则表达式(它还解释了 VIN 规则): http: //lamptricks.blogspot.com/2012/03/vin-regex-pre-1980-and-new.html

这是正则表达式:^((([a-h,A-H,j-n,J-N,p-z,P-Z,0-9]{9})([a-h,A-H,j-n,J-N,p,P,r-t,R-T,v-z,V-Z,0-9])([a-h,A-H,j-n,J-N,p-z,P-Z,0-9])(\d{6}))|(([a-h,A-H,j-z,J-Z,0-9]{6,11})(\d{5})))$

但是下面的 VIN 没有通过测试:BCG23253

它以 5 位数字结尾,长度为 8 个字符——这是 RegEx 的原因……这个 VIN 只是有问题还是 RegEx?

4

2 回答 2

2

那个 RegEx 很难阅读,但是看看这个,在 or 运算符之后:

(([a-h,A-H,j-z,J-Z,0-9]{6,11})(\d{5})))$

...说“在前一组的 6 到 11 之间,后跟 5 位数字”。您的样品 VIN 不符合该标准。

于 2012-03-30T19:04:30.240 回答
2

首先,您找到的正则表达式需要一些工作。一方面,我认为作者不明白逗号在字符类中的含义。如果您忽略不必要的逗号和捕获组,您可以将整个事情简化为:

/^([a-hj-mp-z0-9]{9}[a-hj-mp-rtv-z0-9][a-hj-mp-z0-9]\d{6}|[a-hj-z0-9]{6,11}\d{5})$/i

...然后进一步,取决于您的正则表达式引擎:

/^((?!.{9}[su])[a-z0-9-[io]]{11}\d{6}|[a-hj-z0-9]{6,11}\d{5})$/i

话虽如此,您给出的数字 ( BCG23253) 不满足要求,因为它只有 8 个字符长。为了满足最低要求([a-hj-z0-9]{6-11}\d{5}上面的部分),您的输入必须是 11-17 个字符长,以 5 个数字结尾,并且不包括字母I

所以BCG23253不应该通过,但是BCGBCG23253(例如)会。正如我在上面的评论中所说,我认为我们需要有关您正在寻找的特定匹配的更多信息。在我看来,您发布的正则表达式是为了匹配-1980 后的 VIN,而不是 1980 年之前的 VIN 要么,要么BCG23253毕竟不是有效的 VIN。

于 2012-03-30T21:05:07.550 回答