我正在学习C#和 我有一个小的测试程序,控制台应该接收一个数字作为输入,而不是字母字符。
string inputString;
string pattern = "[A-Za-z]*";
Regex re = new Regex(pattern);
inputString = Console.ReadLine();
while(re.Match(inputString).Success)
{
Console.WriteLine("Please stick to numerals");
inputString = Console.ReadLine();
}
Console.WriteLine(inputString);
问题是编译器不区分字母字符或数字。
也许是任何建议 代码似乎是正确的。
答案 0 :(得分:4)
我不是RegEx过度使用的粉丝,所以这里有一个你可以随时尝试的替代方案......
public bool IsNumeric(string input)
{
foreach(char c in input)
{
if(!char.IsDigit(c))
{
return false;
}
}
return true;
}
你可以按如下方式使用它......
while(!IsNumeric(inputString))
{
Console.WriteLine("Please stick to numerals");
inputString = Console.ReadLine();
}
...当然,如果你想要RegEx,我相信有人会很快把你排除在外;)
感谢Eli Arbel通过以下评论,如果您愿意/能够使用LINQ extension methods,您甚至可以缩短此方法:
public bool IsNumeric(string input)
{
return input.All(x => char.IsDigit(x));
}
答案 1 :(得分:2)
问题是由于string pattern = "[A-Za-z]*";
量词,*
也会匹配0个字符。
如果您只想检查字符串中是否有字母,请使用
string pattern = "[A-Za-z]";
但当然这只匹配ASCII字母。更好的方法是使用Unicode属性
string pattern = @"\p{L}";
\p{L}
将匹配任何Unicode代码点和属性“Letter”。
注意:强>
我希望您知道这不是仅检查数字,而是检查输入中是否有字母。这当然会接受不是数字而不是字母的字符!
如果您想仅检查数字,您应该选择@ musefan的答案或以这种方式使用正则表达式
string inputString;
string pattern = @"^\p{Nd}+$";
Regex re = new Regex(pattern);
inputString = Console.ReadLine();
while (!re.Match(inputString).Success) {
Console.WriteLine("Please stick to numerals");
inputString = Console.ReadLine();
}
Console.WriteLine(inputString);
\p{Nd}
或\p{Decimal_Digit_Number}
:除表意文字脚本外的任何脚本中的数字0到9。
有关Unicode属性的更多信息,请参阅www.regular-expressions.info/unicode。
下一个选择是检查输入中是否有“不是数字”:
string pattern = @"\P{Nd}";
...
while (re.Match(inputString).Success) {
您只需要更改模式,\P{Nd}
是\p{Nd}
的否定,如果输入中有一个非数字,则匹配。