【问题标题】:Regex in c# with an "AND" [duplicate]c# 中的正则表达式,带有“AND”[重复]
【发布时间】:2022-01-22 05:27:31
【问题描述】:

我有以下方法:

        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 个字符并且包含数字或字母。

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

【问题讨论】:

  • 你想匹配什么?您可以使用[A-Za-z0-9]{12} 简化此操作。您的意思是所有字符都必须是字母数字,但其中至少一个必须是数字?
  • 你可以断言一个数字^(?=[A-Za-z]*[0-9])[A-Za-z0-9]{12}$
  • 我还想说 12 个字符中的一个必须是数字,但其中任何一个都可以
  • 如果您可以使用非英文字符,也可以使用\w{12}\w 表示单词字符。您可以将[0-9] 替换为\d
  • @PanagiotisKanavos。是的,这就是我正在尝试的

标签: c# regex .net-5


【解决方案1】:

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

^(?=[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

你不必计算匹配的数量,你可以返回IsMatch的值。

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

【讨论】:

  • 我确定这行得通,但你能帮我理解这意味着什么... ^(?=[A-Za-z]*[0-9])。第二部分很清楚。
  • 这是一个“积极的前瞻”。它基本上意味着“这只是一个匹配,如果从这一点开始的字符串匹配给定的模式”。在您的情况下,该字符串仅在包含 0 个或多个字母后跟一个数字时才匹配。
【解决方案2】:

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

^
(?= .* [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);
}

【讨论】:

    【解决方案3】:

    您也可以使用纯 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';
    

    【讨论】:

    • IsLetter 将匹配任何字母,而不仅仅是英文字母
    • @PanagiotisKanavos 改进了它:)
    猜你喜欢
    • 2016-06-13
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多