c# 中的正则表达式 "AND"

Regex in c# with an "AND"

我有以下方法:

        public static bool isUeiFormatOK(string test)
        {
            string pattern = "[A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9]";
            MatchCollection matches;
            Regex regex = new Regex(pattern);
            matches = regex.Matches(test);

            if (matches.Count == 0)
                return false;

            return true;
        }

这验证字符串是 12 个字符并且包含数字或字母。

怎么说,其中一个字符必须是数字?

为了便于阅读,最好使用两个不同的匹配项,但也可以使用一个。

^
(?= .* [0-9] )
[A-Za-z0-9]{12}
$

(?= ... ) 是前瞻性的。它匹配零个字符,但仅当内部模式在当前位置匹配时才会成功。

完整的解决方案:

private static Regex valid_re = new Regex(
   @"
      ^
      (?= .* [0-9] )
      [A-Za-z0-9]{12}
      $
   ",
   RegexOptions.IgnorePatternWhitespace // | RegexOptions.Compiled 
);

public static bool isUeiFormatOK(string test) {
   return valid_re.IsMatch(test);
}

您也可以使用纯 C# 代码来完成。

public static bool IsUeiFormatOk(string input)
{
    bool hasDigit = false;

    foreach (char character in input)
    {
        if (char.IsDigit(character))
        {
            hasDigit = true;
            continue;
        }

        if (IsEnglishLetter(character))
        {
            continue;
        }

        return false;
    }

    return hasDigit;
}

public static bool IsEnglishLetter(this char letter) =>
    letter is >= 'a' and <= 'z' or >= 'A' and <= 'Z';

您可以使用量词 {12} 来缩短模式,并使用正向先行断言数字,首先可以选择匹配字符 class 的相同允许字符,但不包含数字。

^(?=[A-Za-z]*[0-9])[A-Za-z0-9]{12}$
  • ^ 字符串开头
  • (?=[A-Za-z]*[0-9]) 正面前瞻,断言右边的可选字符 A-Za-z 后跟一个数字
  • [A-Za-z0-9]{12} 匹配 12 次出现的字符 A-Za-z 或数字 0-9
  • $ 字符串结尾(或使用 \z

您不必计算匹配数,您可以 return IsMatch 的值代替。

public static bool isUeiFormatOK(string test)
{
    return new Regex("^(?=[A-Za-z]*[0-9])[A-Za-z0-9]{12}$").IsMatch(test);
}