正则表达式匹配所有美国电话号码格式

25

首先,我想说我在这里看过很多例子并谷歌搜索过,但没有一个符合我所寻找的所有条件,我正在寻找前三个匹配项而不是下面的一些或中间的一些。

请告诉我如何将它们放在一个地方。

(xxx)xxxxxxx
(xxx) xxxxxxx
(xxx)xxx-xxxx
(xxx) xxx-xxxx
xxxxxxxxxx
xxx-xxx-xxxxx

使用方式:

  const string MatchPhonePattern =
           @"\(?\d{3}\)?-? *\d{3}-? *-?\d{4}";
            Regex rx = new Regex(MatchPhonePattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
            // Find matches.
            MatchCollection matches = rx.Matches(text);
            // Report the number of matches found.
            int noOfMatches = matches.Count;
            // Report on each match.

            foreach (Match match in matches)
            {

                tempPhoneNumbers= match.Value.ToString(); ;

             }

输出示例:

3087774825
(281)388-0388
(281)388-0300
(979) 778-0978
(281)934-2479
(281)934-2447
(979)826-3273
(979)826-3255
1334714149
(281)356-2530
(281)356-5264
(936)825-2081
(832)595-9500
(832)595-9501
281-342-2452
1334431660
11个回答

64

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


嘿,运行得非常完美 :) ,只是有一个问题,是否应该添加带有xxxxxxxxxx的那个,因为我认为它可能会获取随机数字,这是可能的吗?例如Google Analytics中的数字等? - confusedMind
它还会捕获任何10位数的数字字符串,无论这是否是您想要的行为由您决定,如果您选择允许它们,则可能值得对与正则表达式匹配的数字进行某种验证。 - FlyingStreudel
3
具有讽刺意味的是,在多个stackoverflow回答中,这个最符合我的需求,所以感谢您的回答。顺便提一下,我也对匹配点和空格感兴趣,所以 \(?\d{3}\)?[. -]? *\d{3}[. -]? *[. -]?\d{4} 对我很有用。 - David M
我想将其限制为只能输入1234567890、123-456-7890。那么正则表达式应该是什么,我不太了解正则表达式。 - Ajay Suwalka
1
以下应该返回false(因为电话号码超过10位),但实际上返回true:Regex.IsMatch("(012)34568902", @"(?\d{3})?-? *\d{3}-? *-?\d{4}" ) Regex.IsMatch("01234568902", @"(?\d{3})?-? *\d{3}-? *-?\d{4}" ) ?Regex.IsMatch("012 345 68902", @"(?\d{3})?-? *\d{3}-? *-?\d{4}" )这应该是你需要的:@"^(?([0-9]{3}))?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$" http://www.authorcode.com/how-to-use-regular-expression-for-validating-phone-numbers-in-net/ - scv
如果最后一组数字超过4位数,这个正则表达式将无法正确匹配。例如,(202) 332-30000、(202) 332-300000000和(202) 332-33030303都可以使用此正则表达式进行有效匹配。更好的方法是使用@"^(((\d{3}) ?)|(\d{3}-))?\d{3}-\d{4}$"。 - user7071176

11
 public bool IsValidPhone(string Phone)
    {
        try
        {
            if (string.IsNullOrEmpty(Phone))
                return false;
            var r = new Regex(@"^\(?([0-9]{3})\)?[-.●]?([0-9]{3})[-.●]?([0-9]{4})$");
            return r.IsMatch(Phone);

        }
        catch (Exception)
        {
            throw;
        }
    }

6

为了补充FlyingStreudel的正确答案,我对其进行了修改,使其接受'.'作为分隔符,这是我所需要的。

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

使用(在字符串中查找所有电话号码):

string text = "...the text to search...";
string pattern = @"\(?\d{3}\)?[-\.]? *\d{3}[-\.]? *[-\.]?\d{4}";
Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
Match match = regex.Match(text);
while (match.Success)
{
    string phoneNumber = match.Groups[0].Value;
    //TODO do something with the phone number
    match = match.NextMatch();
}

5

除了以上所有建议之外,这里是一个强制执行NANP标准的正则表达式:

((?:\(?[2-9](?:(?=1)1[02-9]|(?:(?=0)0[1-9]|\d{2}))\)?\D{0,3})(?:\(?[2-9](?:(?=1)1[02-9]|\d{2})\)?\D{0,3})\d{4})

这个正则表达式遵循NANP标准规则,例如N11代码用于提供三位数拨号访问特殊服务,因此使用条件捕获将其排除在外。它还考虑到各个部分之间最多有3个非数字字符(\D{0,3}),因为我看过一些奇怪的数据。
从提供的测试数据中,这是输出结果:
3087774825
(281)388-0388
(281)388-0300
(979) 778-0978
(281)934-2479
(281)934-2447
(979)826-3273
(979)826-3255
(281)356-2530
(281)356-5264
(936)825-2081
(832)595-9500
(832)595-9501
281-342-2452

注意,由于不符合NANP标准的电话号码,有两个示例值被省略:区号以1开头。
1334714149
1334431660

我所提到的规则可以在国家NANPA网站的区号页面上找到,规定如下:区号的格式为NXX,其中N是2到9的任意数字,X是0到9的任意数字。


1
看了维基百科上的表格(https://en.wikipedia.org/wiki/North_American_Numbering_Plan),似乎这个正则表达式并不完全匹配所描述的模式。尽管如此,它确实正确地排除了服务代码,并且比其他答案中提供的任何正则表达式更接近NANP标准。这是一个非常有用的答案。 - mareoraft

4

不要自己动手。不要使用正则表达式来处理电话号码。Google发布了一个很好的库来处理这个特定的用例:libphonenumber。这里有一个该库的在线演示

public static void Main()
{
    var phoneUtil = PhoneNumberUtil.GetInstance();
    var numberProto = phoneUtil.Parse("(979) 778-0978", "US");
    var formattedPhone = phoneUtil.Format(numberProto, PhoneNumberFormat.INTERNATIONAL);
    Console.WriteLine(formattedPhone);
}

Demo on .NETFiddle


2

我会采用不同的方法来处理这个情况,具体做法如下:

  • 步骤1:从给定的文本中提取所需数字(如果您已经有数字列表,则跳过此步骤)
  • 步骤2:循环处理数字并清理格式
  • 注意:最后一个数字格式错误,但代码只会获取可用部分。

示例文本

Here are a list of contacts you can call:
Justin at +11 (949) 255 6458 or 1-909-885-4469.
Smith at (855) 270 4206 or 555-555-5555.
Sammy at 767.456.5289 or 9876548521x355.
Jill at 254.8695 or 56-852-6645 ext 22

代码

// Step 1: Match numbers from text;
let likePhoneRegex = /([0-9][0-9\s\.\-\(\)\[\]]+[0-9]{4})(\s*?(x|ext|extension)\s*[0-9]{2,})?/gi;
let matchData = sample.match(likePhoneRegex);

// Step 2: Loop and clean up numbers;
let phoneRegex = /(([0-9]*?)([2-9][0-9]{2})?([2-9][02-9]{2})([0-9]{4}))\b/;
let cleanupRegex = /(\+\.\.?)|(\+.*?\.\.)/;
let cleanData = [];
for( var i=0, il=matchData.length, num; i<il; i++){
   num = matchData[i].replace(/[^0-9\x]/g,'')
   var [ phone, ext ] = num.split('x');
   cleanData.push( phone.replace( phoneRegex, "+$2.$3.$4.$5" ).replace( cleanupRegex, '' ) + ( ext && ext.length > 0 ? ' x' + ext : '' ) );
}

结果

[
   "+11.949.255.6458",
   "+1.909.885.4469",
   "855.270.4206",
   "555.555.5555",
   "767.456.5289",
   "987.654.8521 x355",
   "254.8695",
   "852.6645 x22"
]

1

也许我回答得太晚了,但我已经将国家代码作为前缀添加了。州/国外的人需要在电话号码之前添加此代码。我已经将国家代码设置为可选项,人们可以在小括号内输入代码,也可以不带括号,带或不带加号,使用连字符作为分隔符与其余电话号码分开。正则表达式及其示例如下:

regex = '\(?\+?\d{1}\)\?\-?\(?\d{3}\)?-? *\d{3}-? *-?\d{4}';
Acceptable Samples :
(+1)-(111)-222-7878
+1-(111)-222-7878
+1(111)-222-7878
+1-111-222-7878
+1111-222-2323
1111-222-1212
1-111-222-1212
(111)-111-2232
111-222-3333
If you want to make country code mandatory then use following:-
regex = '\(?\+?\d{1}\)\?-?\(?\d{3}\)?-? *\d{3}-? *-?\d{4}';

这个对我来说不知道为什么不能用。 - msarafzadeh

1
^?\(?\d{3}?\)??-??\(?\d{3}?\)??-??\(?\d{4}?\)??-?$

这允许:
  • (123)-456-7890
  • 123-456-7890

那么我该如何使用它? - Alexander

1

对于C#,美国电话号码验证应该如下所示

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

777-777-7777

0

请尝试以下代码,只允许以下格式:

  • 0123456789
  • (123)456-7890
  • (123) 456-7890
  • 1234567890
  • 123-456-67897

字符串 MatchPhonePattern = @"^(\d{3}-\d{3}-\d{4}|\d{10}|(\d{3})\s?\d{3}-\d{4})$"


1
你测试了你的正则表达式模式吗?它只匹配第一个和第四个例子。多年来,已经有几个可行的答案发布在这个问题上,所以新的答案应该提供其他答案没有的东西。我在这个答案中没有看到那个。 - Luke
这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Abhishek Dutt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接