我想检查字符串是否为ABC123类型。
这就是我所做的。我该如何改进代码?
private void ValidationOfFlightCode(string flightCode)
{
if (flightCode.Length == 6)
{
bool state = Regex.IsMatch(flightCode, @"^[a-zA-Z0-9]+$");
if (state)
{
bool isLetter = false;
for (int i = 0; i < 3; i++)
{
isLetter = Char.IsLetter(flightCode, i);
if (!isLetter)
break;
}
if (isLetter)
{
MessageBox.Show(flightCode + ": " + state);
}
else
{
MessageBox.Show("The letters must be before the numbers");
}
}
else
{
MessageBox.Show("Only letters and numbers are allowed!");
}
}
else
{
MessageBox.Show("Flight Code must be 6 characters long");
}
}
答案 0 :(得分:5)
这个正则表达式应该有效:
^[a-zA-Z]{3}[a-zA-Z0-9]{3}$
// ^ ^ ^ ^
// | | | |
// | | | +-- Three times
// | | +--------- Letters or digits
// | +---------------- Three times
// +---------------------- Only letters
如果此正则表达式的IsMatch
返回false
,您可以进一步验证以查看错误。
如何改进代码?
您可以创建一对正则表达式和错误消息的列表。每个正则表达式应该比前一个更具限制性。浏览列表,尝试将代码与正则表达式进行匹配。如果否匹配,则打印错误消息并退出循环。例如,您可以这样做:
^.{6}$
- “代码必须包含六个字符”答案 1 :(得分:1)
如果您不需要对发生的错误如此具体,那么您可以编写一个可以一次性捕获整个规范的正则表达式。我假设表格总是AAAXXX,即三个字母和三个字母(并且最后三个字符中没有字母),但如果字母也可以,那么它很容易适应。
bool isOK = Regex.IsMatch(flightCode, @"^[a-zA-Z]{3}[0-9]{3}$");
该正则表达式还强加了字符的排序和字符串的总长度。但是,我会更进一步,将其作为string
类型的扩展方法:
public static class FlightCodeValidationExtensions {
public static bool IsValidFlightCode(this string str) {
return Regex.IsMatch(flightCode, @"^[a-zA-Z]{3}[0-9]{3}$");
}
}
现在,您可以通过简单地调用str.IsValidFlightCode()
来验证字符串作为航班代码,只要您导入了上述类所在的命名空间(并且Visual Studio中有几个附加组件可以执行此操作)这会自动为您服务。
答案 2 :(得分:0)
在长度检查之前,您还可以进行空检查,具体取决于此函数的输入方式。
另一方面,我个人觉得消息框很烦人。可能更好用文本框旁边的某种标签代替显示错误。
答案 3 :(得分:0)
据我所知,您还希望能够向用户提供有关错误的反馈意见吗? 就个人而言,我可能会在一个正则表达式中测试所有这些条件,就像上面发布的那样。然后,如果它失败了,我会测试其他表达式的数量以获得失败的原因。我对正则表达式比对某些测试迭代更信任。
答案 4 :(得分:0)
进行改进: *你可以跳过正则表达式,因为你会做char.IsLetter。您还可以为第二个3个字符添加char.IsLetterOrDigit(如果这些字符必须为数字,则为char.IsDigit) *当你的失败时,也可以删除'else'分支并抛出一条错误信息,并提供一般所需的格式(“航班代码必须是6个字符长,3个数字和3个数字,如ABC123”)。这样你就可以加快一点,因为你只会测试一次值(if-then-else)
答案 5 :(得分:0)
使用以下代码仅匹配字符串的最后三个字符:
bool isMatch = Regex.IsMatch("flightCode", @"[a-zA-Z0-9]{3}$");