C# 如何使用循环验证字符串中的字符类型和位置?
我目前正在尝试验证作业的字符串,因此我必须不只是给出答案,如果您提供答案,请给出适当的解释,以便我可以从中学习 假设我有一根绳子 (1234)-1234 ABCD 我想创建一个循环,它将遍历该字符串并验证“()”以及“-”和“”的位置。除了验证这些字符外,它们的位置和数据类型也必须相同。最后,它必须位于方法内部 不能使用正则表达式 TLDR; 在方法内部使用循环时,验证字符串中字符和数字的位置。我无法使用正则表达式,需要手动执行此操作 这是我到目前为止所拥有的。但我觉得这个循环会更有效率,看起来也会更好C# 如何使用循环验证字符串中的字符类型和位置?,c#,string,c#-4.0,C#,String,C# 4.0,我目前正在尝试验证作业的字符串,因此我必须不只是给出答案,如果您提供答案,请给出适当的解释,以便我可以从中学习 假设我有一根绳子 (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来中止代码越早越好。另一个优点是,所有剩余的代码都处于低嵌套级别(您的整个方法都在一个大的
,因此与我的方法相比,嵌套+1)if(){
- 从技术上讲,您将问题标记为C#-4.0,但
是C#-6.0out int
- 这里的主要问题是愚蠢的约束会产生愚蠢的代码。很少有正则表达式真的有用。这是极少数的情况之一。因此,现在有两种可能性:生成完全按照请求执行的硬编码不可修改的代码(如我编写的代码),或者创建一个接受变量模式的“库”(与蒙面编辑中使用的编辑类似,您可以告诉蒙面编辑“仅接受
”)并基于此模式验证字符串…但这将是一个穷人的正则表达式,更糟糕的是,因为您必须对其进行维护和测试。在代码发布一个月后,他们会要求您接受(0000)-0000 AAAA
模式…然后是(12345)-1234 ABCD
模式…每两个月更新一次模式(直到大约一年半后,他们会告诉您删除验证程序,因为使用该程序的人讨厌他们,这会减慢他们的工作)(1234)模式,这个问题就会变得很明显-12345 ABCD
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;
}