VIN RegEx 1980年前

时间:2012-03-30 19:00:57

标签: regex vin

我正在尝试使用RegEx来捕捉1980年前的VIN(车辆识别码)。 1980年以前的Anythign不需要是17位数字,可以包含'O'和'U'。

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

以下是RegEx:^((([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?

2 个答案:

答案 0 :(得分:2)

RegEx难以阅读,但请在运算符之后查看:

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

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

答案 1 :(得分: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。