1

シリアル番号の入力に使用する入力フィールドが 1 つある場合:

<div id="sn-check">    
    <input type="text" value="" name="sn" id="sn" size="30" maxlength="14">
</div>

私のjQuery関数は次のようになります。

(function(){    
    var snRegexp = /^[1-9][0-9][0-9][1-2][0-9][0-9][0-9]([0][1-9]|[1][0-2])[0-9]{5}$/;

    $("#sn").on("keyup", function() {
        var text = $(this).val();
        var len = text.length;

        if(len == 14){
            var isMatch = snRegexp.test(text);
            if(isMatch){
                $("#sn-check").addClass("fine");
                $("#sn-check").removeClass("error")
            }else{
                $("#sn-check").addClass("error");
                $("#sn-check").removeClass("fine");
            }

        }else{
            $("#sn-check").removeClass("error");
            $("#sn-check").removeClass("fine");
        }
    });
}());

さて、この機能は働いています。次の形式のすべてのシリアル番号が受け入れられます。

  • 最初の 3 桁: 100 から 999 までのすべての数字
  • 次の 4 桁: 年: 1000-2999
  • 次の 2 桁: 月: 01 - 12
  • 下 5 桁: 00000 から 99999 までのすべての数字

例: 25020130612345

4 つの質問がある場合は、このスクリプトを拡張します。

  1. 正規表現は大丈夫ですか?私が言及した数字だけが受け入れられますか?
  2. 最初の 3 桁は特別な番号 (例: 250、273、278、312、415) のみです。これらの特別な番号のみが有効であり、それ以外はシリアル番号を無効にします。この数字に配列を使用して、入力されたシリアルをチェックする関数に渡すことは可能ですか?
  3. 最後の 5 桁は 00000 ではなく 0000* 1 * で始まる必要があります。正規表現を変更するにはどうすればよいですか?
  4. この関数を 2 番目の正規表現値と別のフィールドで拡張するとよいでしょう。現時点では、投稿されたjquery関数が2回あり、正規表現を含む別のvarがあります。複数の入力フィールドと複数の正規表現で機能するように関数を拡張するにはどうすればよいですか?

私の例が機能するのを見るためにフィドルを作りました:

jsfiddle

4

3 に答える 3

2

あなたのjavascriptのロジックはこのようなものであるべきだと思います。

 var regex = /(\d{3})([12]\d{3})([01][1-9])(\d{5})/,
     input = '25020130612345';

 if (input.match(regex)) {
     // you can now access each part of the input and validate it as you wish
     // e.g. RegExp.$1 will refers to 250, RegExp.$2 will refers to 2013
     if (isValidSpecialNumber(RegExp.$1)) {
         ..
     }
     ..
 }
于 2013-06-07T13:27:37.690 に答える
2

配列でメソッドを使用する場合join(separator)、数値の配列をパターン内の可能な ID のグループに変更できます。

var numberArray = [250, 273, 278, 312, 415];
var snRegexp = new RegExp("/^(" + numberArray.join("|") + ")[12]\d{3}(0[1-9]|1[0-2])(?!00000)\d{5}$/");

3 番目の質問については、パターンで先読みを使用できるはずです ( (?!00000)\d{5}.


説明:numberArray.join("|")配列を受け取り、numberArray文字列 で区切られた配列のすべての内容を含む文字列を返します|。配列がある場合[250, 273, 278, 312, 415]、このメソッドは文字列を返します250|273|278|312|415。正規表現では、 250、273、278、312、または 415 のいずれか(250|273|278|312|415)を意味します。

(?!00000)否定先読みです。これは、次のテキストが等しくないことを意味します00000。負の先読みを使用して、それ以外の場合は を受け入れる数値を から除外します。基本的に、この後に00000が続かない限り、任意の5桁の数字を受け入れることを意味します。\d{5}00000(?!00000)\d{5}

于 2013-06-07T13:23:49.127 に答える
2
  1. 繰り返しの代わりに [0-9]{2} を使用することで少し短縮できることを除けば、あなたの正規表現は私には問題ないように見えます。
  2. 正規表現を介して行うのではなく、後でコードを介してこれをチェックします。一致するグループを使用して、シリアルから特定の「フィールド」を取得できます。
  3. #2 と同じように、regexps の代わりに javascript self を使用して確認します。
  4. フィールド名を特定の正規表現にマップする配列オブジェクトを作成します。そうすれば、そのオブジェクトから使用する正規表現を取得できます。
于 2013-06-07T13:24:23.317 に答える