web-dev-qa-db-ja.com

すべての米国の電話番号形式に一致する正規表現

まず、私はここで多くの例を見てグーグル検索したと言いますが、いくつかのマッチトップ3を探しているすべての条件に一致するものは見つかりませんでした。すべてを1か所にまとめる方法を教えてください。

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

Asを使用:

  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
15
confusedMind

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

43
FlyingStreudel
 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;
        }
    }
9
Karan Singh

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
James Wierzba

どうぞ食べて下さい。これには正規表現を使用しないでください。 Googleは、この特定のユースケース libphonenumber を処理する優れたライブラリをリリースしています。 libのオンラインデモ があります。

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);
}

。NETFiddleのデモ

4
aloisdg

上記のすべての提案に追加するために、NANP標準を実施するRegExを次に示します。

((?:\(?[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})

この正規表現は、N11 codes are used to provide three-digit dialing access to special servicesなどのNANP標準ルールを適用するため、条件付きキャプチャを使用してそれらを除外します。また、いくつかのファンキーなデータを見たので、セクション間の最大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規格では有効な電話番号ではないため、2つのサンプル値が省略されていることに注意してください。市外局番は1で始まります。

1334714149
1334431660

私が言及しているルールは、NANPAのウェブサイトの市外局番ページに記載されています。The format of an area code is NXX, where N is any digit 2 through 9 and X is any digit 0 through 9.

2
user1622895

このコードを書いてみてください、あなたが求めるものを手に入れるかもしれません。

private static List<String> GetValidPhoneNumber(string input,string pattern)
{
    var regex = new Regex(pattern);
    var matchs = regex.Matches(input);
    var validPhoneNumbers = new List<String>();
    foreach(Match match in matchs)
    {
        if(match.Success)
        {
            validPhoneNumbers.Add(match.Value);
        }


    }
    return validPhoneNumbers;
}

またはこのコードを試してください:

    private static List <string>GetValidNumber(string input,string pattern)
    {

        var regex = new Regex(pattern);
        var matches = regex.Matches(input);
        return (from Match Match in matches where Match.Success select Match.Value).ToList();


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

これにより:

  • (123)-456-7890
  • 123-456-7890
0