使用Regex对象检查指定的字符串模式

时间:2012-04-17 07:47:50

标签: c# regex

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

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

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

2 个答案:

答案 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}的否定,如果输入中有一个非数字,则匹配。