2012-03-30 5 views
0

私は1980年以前のVIN(Vehicle Identification Numbers)以前のものを捉えるRegExを使用しようとしています。 Anythign pre 1980は17桁である必要はなく、 'O'と 'U'を含むことができます。VIN RegEx Pre 1980

このサイトは(それはまた、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ですか?正規表現を読み、これを見てするのは難しいされていることを

+1

古いVINは11-16文字でなければならないと言われています。長さ8は有効ではないようです。この部分を見てください: '(([a-h、A-H、j-z、J-Z、0-9] {6,11})(\ d {5})' 5桁の前に6-11文字必要です。 – Wiseguy

+0

@Wiseguy良い点...多分それは悪いデータです。 – mint

+0

読みやすくするために、重複した文字の範囲を削除します(小文字用、大文字用、大文字用のどちらか一方をそのまま残してください)。大文字小文字を区別しませんが、正規表現エンジンのオプションです。 – Wiseguy

答えて

2

まず、あなたが見つけた正規表現にはいくつかの作業が必要です。著者は、文字クラスの中でカンマが何を意味するのかを理解していないと思います。

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

言われていること:あなたの正規表現エンジンに依存し、さらにその後、

/^([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 

...と:あなたは不必要にコンマとキャプチャグループを無視した場合は、これに全体を簡素化することができますあなたが与えた番号(BCG23253)は8文字しかないので要件を満たしていません。最小要件(上記の[a-hj-z0-9]{6-11}\d{5}の部分)を満たすには、入力内容を11〜17文字、5数字で終わらせ、文字はIでなくてはなりません。

したがってBCG23253は合格しませんが、BCGBCG23253(たとえば)となります。私が上記のコメントで言ったように、私はあなたが探している特定のマッチについてより多くの情報が必要だと思います。投稿した正規表現が投稿 -1980 VINとマッチするように作られていて、1980年以前のVINではないように私に聞こえます。どちらか、またはBCG23253は結局、有効なVINではありません。

+0

@WillDelGenioが誤字を指摘してくれてありがとうございます。 –

2

、またはオペレータの後:

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

...「5桁の数字が続き、6間と、先行するグループの11」と言います。あなたのサンプルVINはその基準を満たしていません。

+1

大括弧で囲まれたカンマを削除すると思われます。それらはリテラルカンマと繰り返し一致します。 (私は編集としてこれを提出しようとしましたが、Stackoverflowソフトウェアはそれが6文字以下に変更されたので拒否しました!とにかくあなた自身で編集できます) – thb

+0

@thbそれはopのRegExの直接コピー/ペーストです。問題はカンマではなく、サンプルVINが無効であることです。 – Madbreaks

+1

@Madbreaksカンマはエラー自体を引き起こすわけではありませんが、許可してはいけない文字を許可します。彼らは必要でもなく、望ましくもありません。 – Wiseguy