我是c#的初学者,我怎么能写一个代码,检查是否: 前3个字符是字母 接下来3个是数字, 下两个字母 并且最后一个字符是数字。 如果是不写错误信息。子串和Char.Is/Number混淆。
我试过使用子字符串(0,3),并把它对Char.IsLetter只是为了尝试但失败。
我是c#的初学者,我怎么能写一个代码,检查是否: 前3个字符是字母 接下来3个是数字, 下两个字母 并且最后一个字符是数字。 如果是不写错误信息。子串和Char.Is/Number混淆。
我试过使用子字符串(0,3),并把它对Char.IsLetter只是为了尝试但失败。
下面是使用char.IsLetter
和char.IsNumber
的正确方法。
if(myString.Length == 9
&& char.IsLetter(myString[0])
&& char.IsLetter(myString[1])
&& char.IsLetter(myString[2])
&& char.IsNumber(myString[3])
&& char.IsNumber(myString[4])
&& char.IsNumber(myString[5])
&& char.IsLetter(myString[6])
&& char.IsLetter(myString[7])
&& char.IsNumber(myString[8]))
{
// match.
}
基本上你已经验证了字符串的长度,然后验证每个字符。
你也可以使用char.IsDigit
来限制比赛进行到基数的10位与char.IsNumber
将匹配被视为一个号码的任何Unicode字符(分数,下标,上标,罗马数字,货币numerators,圆圈内的编号,和脚本 - 具体数字)。此外,char.IsLetter
也将匹配任何被认为是偏离基本A-Z之外的字母的Unicode字符。要将数字限制为0-9并将字母限制为A-Z,您可以改为这样。
public static IsAtoZ(char c)
{
return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z');
}
if(myString.Length == 9
&& IsAtoZ(myString[0])
&& IsAtoZ(myString[1])
&& IsAtoZ(myString[2])
&& char.IsDigit(myString[3])
&& char.IsDigit(myString[4])
&& char.IsDigit(myString[5])
&& IsAtoZ(myString[6])
&& IsAtoZ(myString[7])
&& char.IsDigit(myString[8]))
{
// match.
}
但说实话,在这一点上正则表达式会更简洁。但请注意,您仍然需要考虑是否要匹配Unicode字符,并根据该字符使用正确的正则表达式。
你可以使用正则表达式
bool isMatch= Regex.IsMatch("abc123de4", @"\p{L}{3}\d{3}\p{L}{2}\d");
这也会匹配“!!!! abc123de4 $$$$”,因为没有锚。 – juharr
你可以只使用正则表达式:
var regex = new Regex("^[a-z]{3}[0-9]{2}[a-z]{2}[0-9]{1}$", RegexOptions.IgnoreCase);
var matces = regex.Matches(input);
其中input
是要检查的字符串。
当我们将选项RegexOptions.IgnoreCase
传递给Regex
的构造函数时,我们说如果这些字母是大写也没关系。
您可以避免指定此参数并明确声明您希望大写字母和小写字母,正如Rahul在其评论中正确指出的那样。这就好比做如下:
var regex = new Regex("^[a-z][A-Z]{3}[0-9]{2}[a-z][A-Z]{2}[0-9]{1}$");
var matces = regex.Matches(input);
我认为有几种优雅的方式来做到这一点。既然你说你是一个初学者到C#,我建议只找最简单的(最伪码样,恕我直言)的方式,只是表达问题/解决方案:
private bool MatchesPattern(string test)
{
// can't possibly match the pattern with less than 9 chars
if (test.Length < 9) return false;
int idx = 0;
// test are letters
for (int steps = 1; steps <= 3; steps++)
{
if (!char.IsLetter(test[idx++])) return false;
}
// test are numbers
for (int steps = 1; steps <= 3; steps++)
{
if (!char.IsNumber(test[idx++])) return false;
}
// test are letters
for (int steps = 1; steps <= 2; steps++)
{
if (!char.IsLetter(test[idx++])) return false;
}
// test last char is number
if (!char.IsNumber(test.Last())) return false;
return true;
}
您可以测试结果:
private void Test(string testValue)
{
if (!MatchesPattern(testValue))
{
Console.WriteLine("Error!");
}
}
您可以使用正则表达式 – Arash
当您说“字母”时,您的意思是一个Unicode字母吗?作为'Char.IsLetter'检查? – Magnus
只是要清楚你的意思是一个9个字符的字符串。而不是以3个字母,3个数字,2个字母以及任意数量的字符开头的字符串,只要最后一个字符是数字。 – juharr