C# 帮助驾驶执照号码验证正则表达式

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1021362/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-06 05:42:38  来源:igfitidea点击:

Help with drivers license number validation regex

c#regex

提问by North

I'm trying to validate a drivers license for a form that i am making. I was trying to use a single regex.

我正在尝试验证我正在制作的表格的驾照。我试图使用单个正则表达式。

  1. Max length 9 characters
  2. Alphanumeric characters only
  3. Must have at least 4 numeric characters
  4. Must have no more than 2 alphabetic characters
  5. The third and fourth character must be numeric
  1. 最大长度 9 个字符
  2. 仅限字母数字字符
  3. 必须至少有 4 个数字字符
  4. 不得超过 2 个字母字符
  5. 第三个和第四个字符必须是数字

I'm new at regex I'm googling trying to work it out. Help with this would be appreciated.

我是 regex 的新手,我正在谷歌上搜索以解决这个问题。对此的帮助将不胜感激。

采纳答案by Joey

Trying to solve this with just one regex is probably a little hard as you need to keep track of multiple things. I'd suggest you try validating each of the properties separately (unless it makes sense to do otherwise).

尝试只用一个正则表达式来解决这个问题可能有点困难,因为您需要跟踪多个事情。我建议您尝试分别验证每个属性(除非这样做有意义)。

For example you can verify the first and second properties easily by checking for a character classincluding all alphanumeric characters and a quantifierwhich tells that it should be present at most 9 times:

例如,您可以通过检查包含所有字母数字字符和指示它最多出现 9 次的量词字符类来轻松验证第一个和第二个属性:

^[0-9a-zA-Z]{4,9}$

The anchors^and $ensure that this will, in fact, match the entire string and not just a part of it. As Marc Gravell pointed out the string "aaaaa"will match the expression "a{3}"because it can match partially as well.

^$保证,这将在事实上,匹配整个字符串,而不是只是它的一部分。正如 Marc Gravell 指出的,字符串"aaaaa"将匹配表达式,"a{3}"因为它也可以部分匹配。

Checking the fifth property can be done similarly, although this time we don't care about the rest:

可以类似地检查第五个属性,尽管这次我们不关心其余的:

^..[0-9]{2}

Here the ^character is an anchorfor the start of the string, the dot (.)is a placeholder for an arbitrary character and we're checking for the third and fourth character being numeric again with a character class and a repetition quantifier.

这里的^字符是字符串开头的锚点点 ( .)是任意字符的占位符,我们正在使用字符类和重复量词再次检查第三和第四个字符是否为数字。

Properties three and four are probably easiest validated by iterating through the string and keeping counters as you go along.

属性 3 和 4 可能是最容易验证的,方法是遍历字符串并在执行过程中保留计数器。

EDIT:Marc Gravellhas a very nice solution for those two cases with regular expressions as well. Didn't think of those.

编辑:Marc Gravell也为这两种使用正则表达式的情况提供了一个非常好的解决方案。没想到那些

If you absolutely need to do this in one regular expression this will be a bit work (and probably neither faster nor more readable). Basically I'd start with enumerating all possible options such a string could look like. I am using ahere as placeholder for an alphabetic characters and 1as a placeholder for a number.

如果您绝对需要在一个正则表达式中执行此操作,这将有点工作(并且可能既不快也不可读)。基本上,我会首先枚举所有可能的选项,例如字符串可能看起来像。我在a这里用作字母字符1的占位符和数字的占位符。

We need at least four characters (3) and the third and fourth are always fixed as numbers. For four-character strings this leaves us with only one option:

我们至少需要四个字符 (3) 并且第三个和第四个总是固定为数字。对于四字符的字符串,这让我们只有一种选择:

1111

Five-character strings may introduce a letter, though, with different placements:

但是,五个字符的字符串可能会引入一个字母,但位置不同:

a1111
1a111
1111a

and, as before, the all-numeric variant:

和以前一样,全数字变体:

11111

Going on like this you can probably create special rules for each case (basically I'd divide this into "no letter", "one letter" and "two letters" and enumerate the different patterns for that. You can then string together all patterns with the pipe (|)character which is used as an alternative in regular expressions.

继续这样下去,您可能可以为每种情况创建特殊规则(基本上我会将其分为“无字母”、“一个字母”和“两个字母”,并为此列举不同的模式。然后您可以将所有模式串在一起使用管道 ( |)字符作为正则表达式中的替代。

回答by Marc Gravell

Does it have to be a single regex? I'd keep things simple by keeping them separate:

它必须是单个正则表达式吗?我会通过将它们分开来保持简单:

static bool IsValid(string input)
{
    return Regex.IsMatch(input, @"^[A-Za-z0-9]{4,9}$") // length and alphanumeric
        && Regex.IsMatch(input, "^..[0-9]{2}") // 3rd+4th are numeric
        && Regex.IsMatch(input, "(.*[0-9]){4}") // at least 4 numeric
        && !Regex.IsMatch(input, "(.*[A-Za-z]){3}"); // no more than 2 alpha
}

回答by James Fleming

This might get you started...

这可能会让你开始......

function utilities() {
function validateLicense(stateCode, licenseNumber) {
    // from http://www.uiia.org/documents/license_guidelines_08.pdf
    var oneToSevenNumeric = /^[0-9]{1,7}$/;
    var oneAlpha = /(.*[A-Za-z]){1}/;
    var oneAlphaPlusSeven = /^.[0-9]{7}$/;
    var twoAlpha = /(.*[A-Za-z]){2}/;
    var alphaPlusSixNumeric = /(.*[0-9]){6}$/;
    var threeToFiveNumeric = /(.*[0-9]){3,5}$/;
    var fiveToNineNumeric = /(.*[0-9]){5,9}/;
    var sixNumeric = /^[0-9]{6}$/;
    var sevenNumeric = /^[0-9]{7}$/;
    var sevenToNineNumeric = /^[0-9]{7,9}$/;
    var eightAreNumbers = /(.*[0-9]){8}/;
    var nineNumeric = /^[0-9]{9}$/;
    var nineAlphaChars = /^[A-Za-z0-9]{9}$/;
    var tenNumeric = /^[0-9]{10}$/;
    var elevenNumeric = /^.[0-9]{11}$/;
    var twelveNumeric = /^.[0-9]{12}$/;
    var hPlusEight = /([H][0-9]{8})$/;
    var sevenPlusX = /([H][0-9]{7}X)$/;

    if (stateCode == undefined || licenseNumber == undefined) {
        return "";
    }
    if (stateCode == 'AK') {
       return validateExpression(oneToSevenNumeric, licenseNumber, "Must be 1-7 numeric");
    }
    if (stateCode == 'AL') {
      return validateExpression(sevenNumeric, licenseNumber, "Must be 7 numeric");
    }
    if (stateCode == 'AR' || stateCode == 'MS') {
      return validateExpression(nineNumeric, licenseNumber, "Must be 9 numeric");
    }
    if (stateCode == 'AZ') { 
        if (nineNumeric.test(licenseNumber) == true) {
            return "";
        }
        if (oneAlpha.test(licenseNumber) && eightAreNumbers.test(licenseNumber)) {
            return "";
        }
        if (twoAlpha.test(licenseNumber) && threeToFiveNumeric.test(licenseNumber) && licenseNumber.length < 8) {
            return "";
        }
        return "Must be 1 Alphabetic, 8 Numeric; or 2 Alphabetic, 3-6 Numeric; or 9 Numeric";
    }
    if (stateCode == 'CA') {

        if (oneAlpha.test(licenseNumber) && oneAlphaPlusSeven.test(licenseNumber)) {
            return "";
        }
        return "Must be 1 alpha and 7 numeric";
    }
    if (stateCode == 'CO' || stateCode == 'CN' || stateCode == 'CT') {
        return validateExpression(nineNumeric, licenseNumber, "Must be 9 numeric");
    }
    if (stateCode == 'DC') {
        if (sevenNumeric.test(licenseNumber) || nineNumeric.test(licenseNumber)) {
            return "";
        }
        return  "Must be 7 - 9 numeric";
    }
    if (stateCode == 'DE') {
        if (oneToSevenNumeric.test(licenseNumber)) {
            return "";
        }
        return "Must be 1 - 7 numeric";
    }
    if (stateCode == 'FL') {
        if (oneAlpha.test(licenseNumber) && twelveNumeric.test(licenseNumber)) {
            return "";
        }
        return "Must be 1 alpha, 12 numeric";
    }
    if (stateCode == 'GA') {
        if (sevenToNineNumeric.test(licenseNumber)) {
            return "";
        }
        return "Must be 7 - 9 numeric";
    }
    if (stateCode == 'HI') {
        if (nineNumeric.test(licenseNumber) || hPlusEight.test(licenseNumber)) {
            return "";
        }
        return "Must 'H' + 8 numeric; 9 numeric";
    }
    if (stateCode == 'ID') {
        if (nineNumeric.test(licenseNumber) || sixNumeric.test(licenseNumber) || (twoAlpha.test(licenseNumber) && alphaPlusSixNumeric.test(licenseNumber))) {
            return "";
        }
        return "Must 9 numbers or 6 numbers; or 2 char, 6 numbers ";
    }

    if (stateCode == 'IL') {
        if (oneAlpha.test(licenseNumber) && elevenNumeric.test(licenseNumber)) {
            return "";
        }
        return "Must 1 character 11 numbers";
    }
    if (stateCode == 'IN') {
        if (tenNumeric.test(licenseNumber) || nineNumeric.test(licenseNumber)) {
            return "";
        }
        return "Must be 9-10 numbers";
    }
    if (stateCode == 'IA') {
        if (nineAlphaChars.test(licenseNumber) || nineNumeric.test(licenseNumber)) {
            return "";
        }
        return "Must be 9 alpha numbers";
    }
    if (stateCode == 'KS' || stateCode == 'KY') {
        if (nineNumeric.test(licenseNumber) || (oneAlpha.test(licenseNumber) && eightAreNumbers.test(licenseNumber) && licenseNumber.length == 9)) {
            return "";
        }
        return "Must be 1 alpha and 8 numeric";
    }
    if (stateCode == 'LA') {
        if (nineNumeric.test(licenseNumber) == true) {
            return "";
        }
        return "Must be 9 numeric";
    }
    if (stateCode == 'ME') {
        if (sevenNumeric.test(licenseNumber) || sevenPlusX.test(licenseNumber)) {
            return "";
        }
        return "Must be 7 numeric";
    }
    if (stateCode == 'MD' || stateCode == 'MI' || stateCode == 'MN') {
        if (oneAlpha.test(licenseNumber) && twelveNumeric.test(licenseNumber)) {
            return "";
        }
        return "1 Alphabetic, 12 Numeric";
    }
    if (stateCode == 'MA') {
        if ((oneAlpha.test(licenseNumber) && eightAreNumbers.test(licenseNumber) && licenseNumber.length == 9) || nineNumeric.test(licenseNumber)) {
            return "";
        }
        return "Must be 1 alpha, 8 numeric; 9 numeric";
    }

    if (stateCode == 'MO') {
        if ((oneAlpha.test(licenseNumber) && fiveToNineNumeric.test(licenseNumber) && licenseNumber.length < 11) || nineNumeric.test(licenseNumber)) {
            return "";
        }
        return "1 alpha - 5-9 Numeric or 9 numeric";
    }
    return "";
}

function validateExpression(expression, value, error) {
    if (expression.test(value) == true) {
        return "";
    }
    return error;
}

return {
    validateLicense: validateLicense,
    validateExpression: validateExpression
};

}

}