如何使用循环验证字符串中的字符类型和位置?
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
方法returnstrue
或false
。编写错误消息是调用者的工作。
关于代码中早期 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
模式......以及每两个新模式时,这个问题就会变得清晰几个月(直到大约一年半之后,他们会告诉你删除验证器,因为使用该程序的人讨厌他们,这会减慢他们的工作速度)
我目前正在尝试验证作业的字符串,因此我不能简单地给出答案,如果您提供答案,请给出适当的解释,以便我可以从中学习。
假设我有一个字符串
(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
是可以接受的。我在两个不同的支票
中拆分了两个数字部分的 方法returns
true
或false
。编写错误消息是调用者的工作。关于代码中早期
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
模式......以及每两个新模式时,这个问题就会变得清晰几个月(直到大约一年半之后,他们会告诉你删除验证器,因为使用该程序的人讨厌他们,这会减慢他们的工作速度)
uint.Parse