如何使用循环验证字符串中的字符类型和位置?

How do I validate character type and position within a string using a loop?

我目前正在尝试验证作业的字符串,因此我不能简单地给出答案,如果您提供答案,请给出适当的解释,以便我可以从中学习。

假设我有一个字符串

(1234)-1234 ABCD

我想创建一个循环来遍历该字符串并验证“()”以及“-”和“”的位置。除了验证这些字符之外,它们的位置和数据类型也必须相同。最后,它必须在方法内部。

不能使用正则表达式

TLDR; 验证字符串中字符和数字的位置,同时在方法内部使用循环。我不能使用 REGEX,需要手动执行此操作。

这是我目前所拥有的。但我觉得循环会更有效率并且看起来更好。

    public static string PhoneChecker(string phoneStr)
    {
        if (phoneStr[0] == '(' && phoneStr[4] == ')' && phoneStr[5] == ' ' && phoneStr[9] == '-' && phoneStr.Length == 14)
            {

                phoneStr = phoneStr.Remove(0, 1);
                phoneStr = phoneStr.Remove(3, 1);
                phoneStr = phoneStr.Remove(3, 1);
                phoneStr = phoneStr.Remove(6, 1);
                Console.WriteLine(phoneStr);
                if (int.TryParse(phoneStr, out int phoneInt) == false)
                {
                    Console.WriteLine("Invalid");
                }
                else
                {
                    Console.WriteLine("Valid");
                }
            }
        else
        {
            Console.WriteLine("Invalid");
        }
        return phoneStr;
    }

它仍然无法维护,但仍然好一点...请注意,您的代码不适用于您的示例字符串(索引差一)。

public static bool PhoneChecker(string phoneStr)
{
    if (phoneStr.Length != 16 || phoneStr[0] != '(' || phoneStr[5] != ')' || phoneStr[6] != '-' || phoneStr[11] != ' ')
    {
        return false;
    }

    if (!uint.TryParse(phoneStr.Substring(1, 4), out uint phoneInt))
    {
        return false;
    }

    if (!uint.TryParse(phoneStr.Substring(7, 4), out phoneInt))
    {
        return false;
    }

    // No checks for phoneStr.Substring(12, 4)

    return true;
}

一些差异:

  • Length 检查是第一个。否则短 string 会使程序崩溃(因为如果您尝试对长度为 3 的 phoneStr 执行 phoneStr[6],您将得到一个异常)

  • 而不是 int.Parse 我用了 uint.Parse,否则 -500 是可以接受的。

  • 我在两个不同的支票

  • 中拆分了两个数字部分的 uint.Parse
  • 方法returnstruefalse。编写错误消息是调用者的工作。

  • 关于代码中早期 return 的思想有多种流派:我认为越早使用 return false 中止代码越好。另一个优点是所有剩余的代码都处于低嵌套级别(你的整个方法都在一个大 if () { 中,所以与我的相比嵌套 +1)

  • 从技术上讲,您将问题标记为 C#-4.0,但 out int 是 C#-6.0

  • 这里的主要问题是愚蠢的约束会产生愚蠢的代码。 Regex 很少真正有用。这是罕见的案例之一。所以现在你有两种可能性:生成完全按照要求执行的硬编码不可修改代码(就像我写的代码),或者创建一个 "library" 接受可变模式(就像掩码编辑中使用的那些,你可以告诉掩码编辑 "accept only (0000)-0000 AAAA") 并根据此模式验证字符串...但这将是一个穷人的正则表达式,只会更糟,因为您必须维护和测试它。当代码发布一个月后,他们甚至会要求您接受 (12345)-1234 ABCD 模式......然后是 (1234)-12345 ABCD 模式......以及每两个新模式时,这个问题就会变得清晰几个月(直到大约一年半之后,他们会告诉你删除验证器,因为使用该程序的人讨厌他们,这会减慢他们的工作速度)