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");
        }
    });
}());

好的,这个功能正在运行。接受以下格式的所有序列号:

  • 前三位数字:从 100 到 999 的所有数字
  • 接下来的 4 位数字:一年:1000-2999
  • 接下来的 2 位数字:一个月:01 - 12
  • 最后 5 位数字:从 00000 到 99999 的所有数字

例如:25020130612345

如果有四个问题,扩展这个脚本。

  1. 正则表达式好吗?只有我提到的数字被接受吗?
  2. 前三位仅为特殊数字(如250、273、278、312、415),只有这些特殊数字才有效,其他数字使序列号无效。是否可以对这些数字使用数组并将其传递给检查输入序列的函数?
  3. 最后五位数字应该从 0000* 1 * 而不是 00000 开始,我该如何更改我的正则表达式才能做到这一点?
  4. 用第二个正则表达式值和另一个字段扩展这个函数会很棒。目前我有 2 次发布的 jquery 函数和另一个带有正则表达式的 var。如何扩展函数以使用超过 1 个输入字段和超过 1 个正则表达式?

我做了一个小提琴来看看我的例子工作:

jsfiddle

4

3 回答 3

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}$/");

至于第三个问题,您应该能够在模式中使用前瞻(类似于(?!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。我使用否定的前瞻来排除\d{5}原本会接受的数字00000。基本上,(?!00000)\d{5}意味着只要后面没有 00000,就可以接受任何 5 位数字

于 2013-06-07T13:23:49.127 回答
2
  1. 您的正则表达式对我来说看起来不错,除了可以通过使用 [0-9]{2} 而不是重复它来缩短一点。
  2. 之后我会通过代码检查这一点,而不是通过正则表达式来检查。您可以使用匹配组从序列中获取特定的“字段”。
  3. 与 #2 相同,使用 javascript self 而不是正则表达式来检查。
  4. 我将创建一个将字段名称映射到特定正则表达式的数组对象。这样,您可以从该对象中检索要使用的正则表达式。
于 2013-06-07T13:24:23.317 回答
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 回答