RegEx Vin验证1980年前和1980年后

时间:2014-10-27 18:38:30

标签: javascript jquery regex

1981年,车辆识别号码(VIN)使用十七位数系统进行了标准化。在1981年之前,制造商使用自己公司独有的VIN,并且这些数字没有公认的标准,因此不同的制造商使用不同的格式。 http://www.crankshaftcoalition.com/wiki/VIN_decoding

它要求所有出售的越野车辆包含17个字符的VIN,其中不包括字母I(i),O(o)或Q(q)(以避免与数字1混淆)和0)。 http://en.wikipedia.org/wiki/Vehicle_identification_number

所以我想要完成的是下降,如果从1980年到1900年的任何地方被选中,VIN将遵循制造商的指导或者根本不适用于字母I(i),O( o),或Q(q)可以使用任意数量的字符/数字。但是如果选择1981年及之后的RegEx来启动并要求使用我已经显示有效或无效VIN的表达式进行格式化。

暂时插入有效的VIN用于测试目的..如果您删除它将显示的最后一个号码"无效的Vin"

任何建议或帮助将不胜感激!

http://jsfiddle.net/ommLz4th/1/

正则表达式

^[A-HJ-NPR-Z\\d]{8}[\\dX][A-HJ-NPR-Z\\d]{2}\\d{6}$

jQuery Vin Validator

    $(function() {
  $("#vin").on("keyup blur", function() {
    if (validateVin($("#vin").val())) {
      $("#result").css('color', 'green').html("Valid VIN");
      $("#vin").removeClass("not-ok").addClass("ok");
    } else {
      $("#result").css('color', 'red').html("Invalid VIN");
      $("#vin").removeClass("ok").addClass("not-ok");
    }
  });
});


function validateVin(vin) {
  var re = new RegExp("^[A-HJ-NPR-Z\\d]{8}[\\dX][A-HJ-NPR-Z\\d]{2}\\d{6}$");
  return vin.match(re);
}

HTML

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<label name="vin">VIN</label>
<input type="text" id="vin" value="1FAFP40634F172825" />
<span id="result"></span>

下拉以进行测试

<select name="vehicleyear" id="vehicleyear">
    <option value="">Choose Year</option>
    <option value="1985">1985</option>
    <option value="1984">1984</option>
    <option value="1983">1983</option>
    <option value="1982">1982</option>
    <option value="1981">1981</option>
    <option value="1980">1980</option>
    <option value="1979">1979</option>
    <option value="1978">1978</option>
    <option value="1977">1977</option>
    <option value="1976">1976</option>
    <option value="1975">1975</option>
    <option value="1974">1974</option>
</select>

实际下拉

<cfparam name="form.vehicleyear" default="">

<cfset VARIABLES.y1=DatePart("yyyy",Now())>
<cfset VARIABLES.y2=VARIABLES.y1+2>

<cfif Val(form.vehicleyear) LT VARIABLES.y1 or Val(form.vehicleyear) GT VARIABLES.y2>
</cfif>

 <cfoutput>
    <cfselect name="vehicleyear" id="vehicleyear" required="yes" message="Please select vehicle year.">
    <option value="" selected="selected">Select Year</option>
    <cfloop index="i" from="#VARIABLES.y2#" to="1900" step="-1">
    <option value="#i#"<cfif form.vehicleyear EQ i> selected</cfif>>#NumberFormat(i,"0000")#</option>
    </cfloop>
    </cfselect>
 </cfoutput>

1 个答案:

答案 0 :(得分:3)

我不打算为你开发RegExps,但整体模式应该是这样的:

$(function() {
    $("#vin").on("keyup blur", function() {
        if ( validateVin( this.value, Number($("#vehicleyear").val()) ) ) {
            $("#result").css('color', 'green').html("Valid VIN");
            $("#vin").removeClass("not-ok").addClass("ok");
        } else {
            $("#result").css('color', 'red').html("Invalid VIN");
            $("#vin").removeClass("ok").addClass("not-ok");
        }
    });
    function validateVin(vin, date) {
        if(date > 1980) {
            var re = new RegExp("^[A-HJ-NPR-Z\\d]{8}[\\dX][A-HJ-NPR-Z\\d]{2}\\d{6}$");
            return vin.match(re);
        } else {
            //Pre validation are rules to complex. We are forced to assume the vin is valid.
            //Though really at least a simple test would be preferable - eg vin.length >= 20 or whatever
            return true;
        }
    }
});

请注意,vin date 会传递给validateVin(),从而允许代码进行分支。