2009-06-20 16 views
3

私が作成しているフォームの運転免許証を検証しようとしています。 私は単一の正規表現を使用しようとしていました。ドライバのライセンス番号の確認の正規表現

  1. 最大長さは9つの文字
  2. 英数字のみ
  3. は、少なくとも4つの数字
  4. を持たなければならないより
  5. 2つのアルファベット文字よりも第三及び第四の文字が 数値でなければなりません持っている必要があります

私は正規表現で新しいです。私はそれを動作させることを試みているグーグルです。これで助けていただければ幸いです。

+0

私が作っていますフォームの運転免許証を検証しようとしていないイム。私は前にこのような正規表現を行う必要はありません。 – North

+0

さて、私はそれを1つの正規表現 – North

答えて

2

複数のものを追跡する必要があるので、これをただ1つの正規表現で解決しようとするのはおそらく少し難しいでしょう。私はあなたが別のことをする意味がない限り、それぞれのプロパティを別々に検証することをお勧めします。

^[0-9a-zA-Z]{4,9}$ 

anchors^と:あなたはすべての英数字を含むcharacter class、それは高々9回存在しなければならないことを伝えますquantifierをチェックすることによって、第1および第2の特性を簡単に確認することができます例えば

$実際には、文字列の一部だけでなく文字列全体に一致するようにしてください。 Marc Gravellは、文字列 "aaaaa"は部分的にも一致するため、式 "a{3}"と一致することを指摘しています。我々は残りの部分を気にしないでください。この時間が、第五プロパティをチェック

、同様に行うことができます。ここでは

^..[0-9]{2} 

^文字が文字列の先頭のためanchorで、dot (.)です任意の文字のプレースホルダーであり、3番目と4番目の文字が文字クラスと繰り返し量指定子で再び数値になっているかどうかを確認しています。

プロパティ3と4はおそらく、文字列を反復処理し、カウンターを保持することで最も簡単に検証されます。

EDIT:Marc Gravellは、正規表現を使用した2つのケースでも非常に便利です。それらを考えなかった。

これを絶対に1つの正規表現で行う必要がある場合、これはちょっとした作業になるでしょう(おそらく高速ではなく、読みやすくもないでしょう)。基本的には、文字列のように見える可能性のあるすべてのオプションを列挙することから始めます。私はaをアルファベット文字のプレースホルダとして使用し、数字のプレースホルダとして1を使用しています。

少なくとも4文字(3)が必要です.3番目と4番目は常に数字として固定されています。4文字の文字列では、これは唯一の選択肢を私たちに残し:

a1111 
1a111 
1111a 

と、以前のように、オール:

1111 

五文字列が異なる配置で、しかし、手紙を導入することができます数値バリアント:

11111 

は、おそらくそれぞれのケースのための特別なルールを作成することができ、このように行く(基本的に私は、「文字無し」、「1つの文字」と「2つの文字」にこれを分割し、目を列挙したいですそのための異なるパターン。その後、正規表現の代替として使用されるpipe (|)文字を含むすべてのパターンを一緒にストリングできます。

+0

このアプローチでは、ステップ4を除いてすべてをまとめておくと、開始するのに適しています。 2文字の制限を確実にすることができます。 – akf

+1

あなたは、最大長の場合を処理するために長さテストに^と$が必要だと思う... "aaaaa"は "a {3}"にマッチします。 –

+0

ええ、あなたは正しい...訂正 – Joey

1

これは宿題のように聞こえる。その精神の中で、あなたが始めているときに便利なツールの1つは、Webベースの正規表現パーサーです。this one

+0

で試していました。たとえば、vs2008の正規表現に/ dを入力すると、 認識できないエスケープ文字があります。 – North

+0

はい\\ dを代わりに使用します。 –

+1

C#では、regexに逐語的な文字列構文を使用することをお勧めします。 「\\ d」ではなく「\ d」です。 –

4

正規表現が1つである必要はありますか?私は別のそれらを保つことによって物事をシンプルに保つと思います:

static bool IsValid(string input) 
{ 
    return Regex.IsMatch(input, @"^[A-Za-z0-9]{4,9}$") // length and alphanumeric 
     && Regex.IsMatch(input, "^..[0-9]{2}") // 3rd+4th are numeric 
     && Regex.IsMatch(input, "(.*[0-9]){4}") // at least 4 numeric 
     && !Regex.IsMatch(input, "(.*[A-Za-z]){3}"); // no more than 2 alpha 
} 
+0

それは私の考えだった。読みやすく、理解しやすく、保守しやすくなっています。 –

0

AKF
に同意し、それが正規表現概念のいくつかの素晴らしい明確な説明を持っているとしてもthis siteをチェックアウト

0

は、残念ながら、私たちがここを可能にしているよりも多くの様々ながあるように思われます。ウィスコンシンは14文字、古いNY州のライセンスは19文字などです。docを参照してください。もちろん、そこには複数の国があります。

1

これはあなたが始めるかもしれません...

function utilities() { 
function validateLicense(stateCode, licenseNumber) { 
    // from http://www.uiia.org/documents/license_guidelines_08.pdf 
    var oneToSevenNumeric = /^[0-9]{1,7}$/; 
    var oneAlpha = /(.*[A-Za-z]){1}/; 
    var oneAlphaPlusSeven = /^.[0-9]{7}$/; 
    var twoAlpha = /(.*[A-Za-z]){2}/; 
    var alphaPlusSixNumeric = /(.*[0-9]){6}$/; 
    var threeToFiveNumeric = /(.*[0-9]){3,5}$/; 
    var fiveToNineNumeric = /(.*[0-9]){5,9}/; 
    var sixNumeric = /^[0-9]{6}$/; 
    var sevenNumeric = /^[0-9]{7}$/; 
    var sevenToNineNumeric = /^[0-9]{7,9}$/; 
    var eightAreNumbers = /(.*[0-9]){8}/; 
    var nineNumeric = /^[0-9]{9}$/; 
    var nineAlphaChars = /^[A-Za-z0-9]{9}$/; 
    var tenNumeric = /^[0-9]{10}$/; 
    var elevenNumeric = /^.[0-9]{11}$/; 
    var twelveNumeric = /^.[0-9]{12}$/; 
    var hPlusEight = /([H][0-9]{8})$/; 
    var sevenPlusX = /([H][0-9]{7}X)$/; 

    if (stateCode == undefined || licenseNumber == undefined) { 
     return ""; 
    } 
    if (stateCode == 'AK') { 
     return validateExpression(oneToSevenNumeric, licenseNumber, "Must be 1-7 numeric"); 
    } 
    if (stateCode == 'AL') { 
     return validateExpression(sevenNumeric, licenseNumber, "Must be 7 numeric"); 
    } 
    if (stateCode == 'AR' || stateCode == 'MS') { 
     return validateExpression(nineNumeric, licenseNumber, "Must be 9 numeric"); 
    } 
    if (stateCode == 'AZ') { 
     if (nineNumeric.test(licenseNumber) == true) { 
      return ""; 
     } 
     if (oneAlpha.test(licenseNumber) && eightAreNumbers.test(licenseNumber)) { 
      return ""; 
     } 
     if (twoAlpha.test(licenseNumber) && threeToFiveNumeric.test(licenseNumber) && licenseNumber.length < 8) { 
      return ""; 
     } 
     return "Must be 1 Alphabetic, 8 Numeric; or 2 Alphabetic, 3-6 Numeric; or 9 Numeric"; 
    } 
    if (stateCode == 'CA') { 

     if (oneAlpha.test(licenseNumber) && oneAlphaPlusSeven.test(licenseNumber)) { 
      return ""; 
     } 
     return "Must be 1 alpha and 7 numeric"; 
    } 
    if (stateCode == 'CO' || stateCode == 'CN' || stateCode == 'CT') { 
     return validateExpression(nineNumeric, licenseNumber, "Must be 9 numeric"); 
    } 
    if (stateCode == 'DC') { 
     if (sevenNumeric.test(licenseNumber) || nineNumeric.test(licenseNumber)) { 
      return ""; 
     } 
     return "Must be 7 - 9 numeric"; 
    } 
    if (stateCode == 'DE') { 
     if (oneToSevenNumeric.test(licenseNumber)) { 
      return ""; 
     } 
     return "Must be 1 - 7 numeric"; 
    } 
    if (stateCode == 'FL') { 
     if (oneAlpha.test(licenseNumber) && twelveNumeric.test(licenseNumber)) { 
      return ""; 
     } 
     return "Must be 1 alpha, 12 numeric"; 
    } 
    if (stateCode == 'GA') { 
     if (sevenToNineNumeric.test(licenseNumber)) { 
      return ""; 
     } 
     return "Must be 7 - 9 numeric"; 
    } 
    if (stateCode == 'HI') { 
     if (nineNumeric.test(licenseNumber) || hPlusEight.test(licenseNumber)) { 
      return ""; 
     } 
     return "Must 'H' + 8 numeric; 9 numeric"; 
    } 
    if (stateCode == 'ID') { 
     if (nineNumeric.test(licenseNumber) || sixNumeric.test(licenseNumber) || (twoAlpha.test(licenseNumber) && alphaPlusSixNumeric.test(licenseNumber))) { 
      return ""; 
     } 
     return "Must 9 numbers or 6 numbers; or 2 char, 6 numbers "; 
    } 

    if (stateCode == 'IL') { 
     if (oneAlpha.test(licenseNumber) && elevenNumeric.test(licenseNumber)) { 
      return ""; 
     } 
     return "Must 1 character 11 numbers"; 
    } 
    if (stateCode == 'IN') { 
     if (tenNumeric.test(licenseNumber) || nineNumeric.test(licenseNumber)) { 
      return ""; 
     } 
     return "Must be 9-10 numbers"; 
    } 
    if (stateCode == 'IA') { 
     if (nineAlphaChars.test(licenseNumber) || nineNumeric.test(licenseNumber)) { 
      return ""; 
     } 
     return "Must be 9 alpha numbers"; 
    } 
    if (stateCode == 'KS' || stateCode == 'KY') { 
     if (nineNumeric.test(licenseNumber) || (oneAlpha.test(licenseNumber) && eightAreNumbers.test(licenseNumber) && licenseNumber.length == 9)) { 
      return ""; 
     } 
     return "Must be 1 alpha and 8 numeric"; 
    } 
    if (stateCode == 'LA') { 
     if (nineNumeric.test(licenseNumber) == true) { 
      return ""; 
     } 
     return "Must be 9 numeric"; 
    } 
    if (stateCode == 'ME') { 
     if (sevenNumeric.test(licenseNumber) || sevenPlusX.test(licenseNumber)) { 
      return ""; 
     } 
     return "Must be 7 numeric"; 
    } 
    if (stateCode == 'MD' || stateCode == 'MI' || stateCode == 'MN') { 
     if (oneAlpha.test(licenseNumber) && twelveNumeric.test(licenseNumber)) { 
      return ""; 
     } 
     return "1 Alphabetic, 12 Numeric"; 
    } 
    if (stateCode == 'MA') { 
     if ((oneAlpha.test(licenseNumber) && eightAreNumbers.test(licenseNumber) && licenseNumber.length == 9) || nineNumeric.test(licenseNumber)) { 
      return ""; 
     } 
     return "Must be 1 alpha, 8 numeric; 9 numeric"; 
    } 

    if (stateCode == 'MO') { 
     if ((oneAlpha.test(licenseNumber) && fiveToNineNumeric.test(licenseNumber) && licenseNumber.length < 11) || nineNumeric.test(licenseNumber)) { 
      return ""; 
     } 
     return "1 alpha - 5-9 Numeric or 9 numeric"; 
    } 
    return ""; 
} 

function validateExpression(expression, value, error) { 
    if (expression.test(value) == true) { 
     return ""; 
    } 
    return error; 
} 

return { 
    validateLicense: validateLicense, 
    validateExpression: validateExpression 
}; 

}