正则表达式的外观是否可以匹配一个或两个数字?

时间:2015-04-09 23:09:33

标签: c# regex

我正在接受用户输入(字符串)并根据3种不同的reg ex模式进行检查。这样做的原因是我们正在进行异步验证,验证功能会在每个键上启动。用户输入字符串连接,因此每次迭代都会更长。

正则表达式应该匹配1到3位数字,然后是空格,然后是1到3位数字。例子:

Correct: 
1 
12
12 26
123 12

Incorrect
any letter or spec character
any space before a number (space after first set of numbers is ok).

以下功能有效:

    static void Main(string[] args)
    {
        string userInput = Console.ReadLine();

        List<string> patternList = new List<string>();
        patternList.Add(@"^([0-9])$");
        patternList.Add(@"^[0-9]{1,3} $");
        patternList.Add(@"^[0-9]{1,3} [0-9]{1,3}$");

        ValidateInput(userInput, patternList);
    }

    private static void ValidateInput(string userInput, List<string> patternList)
    {
        Regex r = null;
        Match m = null;
        bool IsMatch = false;
        foreach (var p in patternList)
        {
            r = new Regex(p);
            m = r.Match(userInput);
            IsMatch = m.Success;
            if (IsMatch)
                break;
        }                       

        if (IsMatch)
        {
            Console.WriteLine("You wrote: {0} Thats a match", userInput);
            Console.ReadLine();
        }
        else
        {
            Console.WriteLine("You wrote: {0} Thats NOT a match", userInput);
            Console.ReadLine();
        }
    }

但我希望看看是否可以使用一个表达式(而不是3个)。看起来像是在表达式后面的负面看法,以确保在空格之前有一个数字?

2 个答案:

答案 0 :(得分:2)

您根本不需要环视,只需将三个正则表达式压缩为一个:

^([0-9]{1,3})(?: ([0-9]{1,3})?)?$

?:表示它是非捕获组,因此第一个匹配组将捕获第一个数字,第二个捕获组显然是第二个。

如果两个数字之间的空格序列是任意的(一个或多个空格,制表符,等等),您还可以使用:

^([0-9]{1,3})(?:\s+([0-9]{1,3})?)?$

代替。

显然可以使用Lookahead和lookbehind,但是使事情变得更复杂,更难以解析。此外,在许多情况下,前瞻用于模式,而不是模式。 模式也可以使用析取(|)来实现。

答案 1 :(得分:1)

这一个表达式会在输入时验证输入(无需环视)。

^[0-9]{1,3}(?:\s[0-9]{0,3})?$