子字符串和Char./数字混乱
本文关键字:数字 混乱 Char 字符串 | 更新日期: 2023-09-27 18:13:56
我是c#的初学者,我怎么写一个代码来检查:前3个字符是字母接下来的三个是数字,接下来的两封信最后一个字符是数字。如果不是,则写一条错误消息。
我试过使用Substring(0,3)并把它放在Char上。我只是想尝试一下,但失败了。
以下是使用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字符(分数、下标、上标、罗马数字、货币分子、包围数字和特定于脚本的数字)。此外,char.IsLetter
还将匹配任何被视为字母的Unicode字符,这些字符将偏离基本的a - z。要将数字限制为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");
您可以使用正则表达式:
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#中可以这样访问字符串中的单个字符:
string s = "1test";
char c = s[0];
c将是'1' 1。
在下一步中,您可以使用Char。IsNumber返回bool值的方法。就像这样:
if(c.IsNumber()){}
然后对接下来的两个字符执行相同的操作,只是使用Char。胰岛方法。
我认为有几种优雅的方法可以做到这一点。既然你说你是c#的初学者,我建议你找到最简单的(最像伪代码的,IMHO)方式来表达问题/解决方案:
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!");
}
}