0

我正在学习 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);

问题是编译器不区分字母字符或数字。

任何建议也许代码似乎是正确的。

4

2 回答 2

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 扩展方法,您甚至可以缩短此方法

public bool IsNumeric(string input)
{
   return input.All(x => char.IsDigit(x));
}
于 2012-04-17T07:52:39.017 回答
2

问题是由于量词,它string pattern = "[A-Za-z]*";也会匹配 0 个字符。*

如果您只想检查字符串中是否有字母,只需使用

string pattern = "[A-Za-z]";

但当然这只是匹配 ASCII 字母。更好的方法是使用 Unicode 属性

string pattern = @"\p{L}";

\p{L}将匹配任何具有“字母”属性的 Unicode 代码点。

笔记:

我希望您知道这不是仅检查数字,而是检查输入中是否有字母。这当然会接受不是数字和字母的字符!

如果你只想检查数字,你应该去@musefan's answer或以这种方式使用正则表达式

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}并且将匹配。

于 2012-04-17T07:58:24.643 回答