javascript - 1980 年前和 1980 年后的 RegEx Vin 验证

标签 javascript jquery regex

1981 年,车辆识别号 (VIN) 使用 17 位系统进行了标准化。在 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), or 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 识别码验证器

    $(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>

最佳答案

我不会为您开发正则表达式,但整体模式应该是这样的:

$(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() 从而允许代码分支。

关于javascript - 1980 年前和 1980 年后的 RegEx Vin 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26594504/

相关文章:

javascript - 如何使用无限滚动和砌体实现 addthis share

javascript - 使用Jquery控制表宽度问题

javascript - 使用brain.js(js中的神经网络)来学习元素背景图像的对比度

javascript - 需要帮助 : RegEx for a password containing numbers and special chars

regex - 试图理解这个正则表达式的含义

javascript - React Native - 二维码生成器大小限制

javascript - 在 google appmaker 中,无法使 requestAnimationFrame 工作

javascript - Angular 2 NgFor 模式错误消息未显示

javascript - 将 javascript 生成的图像复制到剪贴板

javascript - 如何在加载时将类添加到 div?