N个元素的正则表达式,不能少于

时间:2015-07-21 16:08:48

标签: c# regex

我试图弄清楚用于查找的正则表达式与确切的N次出现匹配,而不是更少,而不是更多,与一组字符匹配。它看起来像一个非常简单的任务,但我无法找到适当的正则表达式。

更具体地说,我想要一个正则表达式,告诉一个给定的字符串是否包含正好3个数字 - 不少于,不多于。

我以为我只需将3位数作为一组处理并在其后添加{1}的量词就可以实现它,但它不起作用。

或者,我预期[0-9] [0-9] [0-9]也能正常工作,但同样没有。对于输入集,正则表达式都会返回相同的结果 1,12,123,1234,12345。

以下是执行我尝试过的代码示例,如上所述。

class Program
{
    static void Main(string[] args)
    {
        List<Regex> regexes = new List<Regex> { new Regex("\\d{3}"), new Regex("[0-9][0-9][0-9]"), new Regex("(\\d{3}){1}") };
        List<int> numbers = new List<int> { 1, 12, 123, 1234, 12345 };

        foreach(Regex regex in regexes)
        {
            Console.WriteLine("Testing regex {0}", regex.ToString());
            foreach (int number in numbers)
            {
                Console.WriteLine(string.Format("{0} {1}", number, regex.IsMatch(number.ToString()) ? "is a match" : "not a match"));
            }
            Console.WriteLine();
        }
    }
}

上述程序的输出是: enter image description here

显然,从所有输入值中只有123是匹配。 什么是正则表达式,对待&#34; 123&#34;单独作为一个匹配?

3 个答案:

答案 0 :(得分:6)

所有正则表达式都适用于输入上的3位任何位置。您正在寻找:

new Regex("^\\d{3}$")

^匹配输入的开头,$匹配输入的结尾。所以这个正则表达式表示,&#34;从一开始,必须有三位数,然后期望结束。&#34;

答案 1 :(得分:3)

您应该使用^作为前缀以指示字符串的开头,并使用$来表示其结束。有关工作示例,请参阅http://regexr.com/3be8e

答案 2 :(得分:1)

您应该查找n个字符,后跟非字符。因此,如果您正在寻找数字,您应该寻找n数字后跟一个非数字。确保你在正则表达式之前也是一个非数字。