我正在尝试使用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?
答案 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。