使用jquery和regex检查序列号

时间:2013-06-07 13:11:38

标签: jquery regex

如果有一个输入字段用于输入序列号:

<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个正则表达式?
  5. 我小心翼翼地看到我的例子在工作:

    jsfiddle

3 个答案:

答案 0 :(得分: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位数字

答案 1 :(得分:2)

  1. 你的正则表达式看起来没问题,除了可以通过使用[0-9] {2}而不是重复它来缩短它。
  2. 之后我会通过代码检查这个,而不是通过regexp来做。您可以使用匹配组从序列中获取特定的“字段”。
  3. 与#2相同,使用javascript self而不是regexps来检查。
  4. 我会创建一个数组对象,将字段名称映射到特定的正则表达式。这样,您就可以检索要从该对象使用的正则表达式。

答案 2 :(得分: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)) {
         ..
     }
     ..
 }