嵌套量词*异常与C#正则表达式匹配美国电话号码

时间:2015-08-08 12:07:12

标签: c# regex

以下表达式应与美国电话号码匹配:

\(?\d{3}\)?-? *\d{3}-? *-?\d{4}

但是,当我在我的程序中使用它时会出现错误:

  

解析“(?\ d {3})? - ?* \ d {3} - ?* - ?\ d {4}” - 嵌套量词*。

我无法看到错误的位置。 :(

适用于regex101适用于:

(111) 111-1111
111-111-1111
1111111111

但在与C#Regex一起使用时似乎不起作用。

我感谢任何指导。 TIA

(C#VS2010 .NET 4.0)

编辑:     这解决了这个问题:

 \(?\d{3}\)?-?\s*\d{3}-?\s*-?\d{4}

仍然不知道为什么会出现嵌套量词错误?

2 个答案:

答案 0 :(得分:4)

第一个正则表达式的问题在于它包含使用RegexOptions.IgnorePatternWhitespace选项时被忽略的文字空格。请参阅this demo检查 Ignore Whitespace选项以重现此问题。

你的第一个正则表达式等于

\(?\d{3}\)?-?*\d{3}-?*-?\d{4}
             ^       ^

要使此正则表达式正常工作,请不要使用RegexOptions.IgnorePatternWhitespace选项,否则*量词将应用于.NET正则表达式中不允许的?量词。

或者使用[ ]\s替换空格。 E.g。

\(?\d{3}\)?-?[ ]*\d{3}-?[ ]*-?\d{4}

使用RegexOptions.IgnorePatternWhitespace标志时,不会忽略字符类中的空格(参见RegexOptions Enumeration MSDN page)。

请参阅demo

答案 1 :(得分:1)

也许这个?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;


namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Regex RegexObj = new Regex("\\(?\\d{3}-?\\)?\\s*\\d{3}-?\\s*-?\\d{4}");
            String Str1 = "(111) 111-1111";
            String Str2 = "111-111-1111";
            String Str3 = "1111111111";
            Console.Write(RegexObj.IsMatch(Str1).ToString() + '\n');
            Console.Write(RegexObj.IsMatch(Str2).ToString() + '\n');
            Console.Write(RegexObj.IsMatch(Str3).ToString() + '\n');


            Console.Read();
        }
    }
}

enter image description here