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

C# 如何使用循环验证字符串中的字符类型和位置?,c#,string,c#-4.0,C#,String,C# 4.0,我目前正在尝试验证作业的字符串,因此我必须不只是给出答案,如果您提供答案,请给出适当的解释,以便我可以从中学习 假设我有一根绳子 (1234)-1234 ABCD 我想创建一个循环,它将遍历该字符串并验证“()”以及“-”和“”的位置。除了验证这些字符外,它们的位置和数据类型也必须相同。最后,它必须位于方法内部 不能使用正则表达式 TLDR; 在方法内部使用循环时,验证字符串中字符和数字的位置。我无法使用正则表达式,需要手动执行此操作 这是我到目前为止所拥有的。但我觉得这个循环会更有效率,看起来

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

假设我有一根绳子

(1234)-1234 ABCD

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

不能使用正则表达式

TLDR; 在方法内部使用循环时,验证字符串中字符和数字的位置。我无法使用正则表达式,需要手动执行此操作

这是我到目前为止所拥有的。但我觉得这个循环会更有效率,看起来也会更好

    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;
    }

它仍然是不可维护的,但仍然有一点更好。。。请注意,您的代码不能处理示例字符串(索引被关闭了一个)

一些差异:

  • Length
    检查是第一个。否则,短的
    字符串
    会使程序崩溃(因为如果您尝试在长度为3的
    phoneStr
    上执行
    phoneStr[6]
    ,则会出现异常)

  • 我没有使用
    int.Parse
    而是使用
    uint.Parse
    ,否则
    -500
    是可以接受的

  • 我已经将
    uint.Parse拆分为两个不同检查中的两个子部分数字

  • 该方法返回
    true
    false
    。编写错误消息是调用方的工作

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

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

  • 这里的主要问题是愚蠢的约束会产生愚蠢的代码。很少有正则表达式真的有用。这是极少数的情况之一。因此,现在有两种可能性:生成完全按照请求执行的硬编码不可修改的代码(如我编写的代码),或者创建一个接受变量模式的“库”(与蒙面编辑中使用的编辑类似,您可以告诉蒙面编辑“仅接受
    (0000)-0000 AAAA
    ”)并基于此模式验证字符串…但这将是一个穷人的正则表达式,更糟糕的是,因为您必须对其进行维护和测试。在代码发布一个月后,他们会要求您接受
    (12345)-1234 ABCD
    模式…然后是
    (1234)模式,这个问题就会变得很明显-12345 ABCD
    模式…每两个月更新一次模式(直到大约一年半后,他们会告诉您删除验证程序,因为使用该程序的人讨厌他们,这会减慢他们的工作)


为什么标记为C?您的代码中没有循环。非常感谢您的这篇文章。这正是我想要的。我一直在思考这些问题,但出于某种原因,我不断出现错误,现在我看到的错误是因为我试图将循环放在字符串方法而不是布尔方法中。
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;
}