C# 如何验证电话号码

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/29970244/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-09 04:24:43  来源:igfitidea点击:

How to validate a phone number

c#regex

提问by Adam Higgins

A valid phone number contains:

有效的电话号码包含:

less than 9 characters, a "+" at the start, and only digits.

少于 9 个字符,以“+”开头,并且只有数字。

Im trying to use regular expressions but i've only started using them and im not good at it. The code i have so far is:

我正在尝试使用正则表达式,但我才刚刚开始使用它们,而且我并不擅长。我到目前为止的代码是:

static void Main(string[] args)
{
    Console.WriteLine("Enter a phone number.");
    string telNo = Console.ReadLine();

    if (Regex.Match(telNo, @"^(\+[0-9])$").Success)
        Console.WriteLine("correctly entered");

    else
        Console.WriteLine("incorrectly entered");

    Console.ReadLine();
}

But i don't know how to check the length of the string this way. Any help is appreciated.

但我不知道如何以这种方式检查字符串的长度。任何帮助表示赞赏。

采纳答案by Greg

Jacek's regex works fine

Jacek的正则表达式工作正常

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Enter a phone number.");
        string telNo = Console.ReadLine();                      
        Console.WriteLine("{0}correctly entered", IsPhoneNumber(telNo) ? "" : "in");    
        Console.ReadLine(); 
    }

    public static bool IsPhoneNumber(string number)
    {
        return Regex.Match(number, @"^(\+[0-9]{9})$").Success;
    }
}

回答by Jacek

Your regex should look like this, you need information about char counter

您的正则表达式应如下所示,您需要有关字符计数器的信息

@"^(\+[0-9]{9})$"

回答by maniak1982

Something like this could work:

这样的事情可以工作:

^+\d{0,9}

^+\d{0,9}

But I would suggest playing around with a regex tester to learn more about how regular expressions work. I still like to use them heavily myself, as I don't write regular expressions often. Here is one example but there are many more out there.

但我建议使用 regex tester 来了解有关正则表达式如何工作的更多信息。我自己仍然喜欢大量使用它们,因为我不经常编写正则表达式。这是一个示例,但还有更多示例。

https://regex101.com/

https://regex101.com/

回答by Amit Gorvadiya

Simple function for Valid USAPhoneNumber or not.

有效 USAPhoneNumber 的简单函数与否。

   /// <summary>
    /// Allows phone number of the format: NPA = [2-9][0-8][0-9] Nxx = [2-9]      [0-9][0-9] Station = [0-9][0-9][0-9][0-9]
    /// </summary>
    /// <param name="strPhone"></param>
    /// <returns></returns>
    public static bool IsValidUSPhoneNumber(string strPhone)
    {
        string regExPattern = @"^[01]?[- .]?(\([2-9]\d{2}\)|[2-9]\d{2})[- .]?\d{3}[- .]?\d{4}$";
        return MatchStringFromRegex(strPhone, regExPattern);
    }
    // Function which is used in IsValidUSPhoneNumber function
    public static bool MatchStringFromRegex(string str, string regexstr)
    {
        str = str.Trim();
        System.Text.RegularExpressions.Regex pattern = new System.Text.RegularExpressions.Regex(regexstr);
        return pattern.IsMatch(str);
    }

回答by Casey Crookston

DON'T USE A REGULAR EXPRESSION!!

不要使用正则表达式!!

There are too many variables for a regex to be of any use. Instead, just remove all characters from your string that are not 0-9, and then check to see if you have the correct number of digits left. Then it doesn't matter what extra stuff the user includes or doesn't include... ()x-+[] etc etc, as it just strips them all out and only counts the characters 0-9.

正则表达式的变量太多,没有任何用处。相反,只需从字符串中删除所有非 0-9 的字符,然后检查是否剩余正确的位数。那么用户包含或不包含什么额外的东西并不重要...... ()x-+[] 等,因为它只是将它们全部删除并且只计算字符 0-9。

I've got a string extension that works great, and allows for a wide range of formats. It accepts an IsRequiredparameter. So, you can validate a phone number like this:

我有一个很好用的字符串扩展,并且支持多种格式。它接受一个IsRequired参数。因此,您可以像这样验证电话号码:

string phone = "(999)999-9999"
bool isValidPhone = phone.ValidatePhoneNumber(true) // returns true

string phone ="1234567890"
bool isValidPhone = phone.ValidatePhoneNumber(true) // returns true

string phone = ""
bool isValidPhone = phone.ValidatePhoneNumber(false) // not required, so returns true

string phone = ""
bool isValidPhone = phone.ValidatePhoneNumber(true) // required, so returns false

string phone ="12345"
bool isValidPhone = phone.ValidatePhoneNumber(true) // returns false

string phone ="foobar"
bool isValidPhone = phone.ValidatePhoneNumber(true) // returns false

Here's the code (assumes a 10-digit American phone number. Adjust accordingly):

这是代码(假设是 10 位美国电话号码。相应地调整):

public static class StringExtensions
{

    /// <summary>
    /// Checks to be sure a phone number contains 10 digits as per American phone numbers.  
    /// If 'IsRequired' is true, then an empty string will return False. 
    /// If 'IsRequired' is false, then an empty string will return True.
    /// </summary>
    /// <param name="phone"></param>
    /// <param name="IsRequired"></param>
    /// <returns></returns>
    public static bool ValidatePhoneNumber(this string phone, bool IsRequired)
    {
        if (string.IsNullOrEmpty(phone) & !IsRequired)
            return true;

        if (string.IsNullOrEmpty(phone) & IsRequired)
            return false;

        var cleaned = phone.RemoveNonNumeric();
        if (IsRequired)
        {
            if (cleaned.Length == 10)
                return true;
            else
                return false;
        }
        else
        {
            if (cleaned.Length == 0)
                return true;
            else if (cleaned.Length > 0 & cleaned.Length < 10)
                return false;
            else if (cleaned.Length == 10)
                return true;
            else
                return false; // should never get here
        }
    }

    /// <summary>
    /// Removes all non numeric characters from a string
    /// </summary>
    /// <param name="phone"></param>
    /// <returns></returns>
    public static string RemoveNonNumeric(this string phone)
    {
        return Regex.Replace(phone, @"[^0-9]+", "");
    }
}

回答by Ash

If you're looking for a country specific regex, try this expression which works for all Australian (+61-) numbers. I've put comments on how to go about varying it for other uses.

如果您正在寻找特定于国家/地区的正则表达式,请尝试这个适用于所有澳大利亚 (+61-) 数字的表达式。我已经就如何改变它用于其他用途发表了评论。

public static bool IsValidPhoneNumber(string phoneNumber)
{
    //will match +61 or +61- or 0 or nothing followed by a nine digit number
    return Regex.Match(phoneNumber, 
        @"^([\+]?61[-]?|[0])?[1-9][0-9]{8}$").Success;
    //to vary this, replace 61 with an international code of your choice 
    //or remove [\+]?61[-]? if international code isn't needed
    //{8} is the number of digits in the actual phone number less one
}

回答by Tech

This solution validates every test criteria for validating a phone number, it also leverages from the Regex API. Criteria includes spacing, any non numeric values, area codes (which you specify), number of values (digits) the phone number should have, and also includes error messaging as well as phone number old and new state.

此解决方案验证用于验证电话号码的每个测试标准,它还利用 Regex API。标准包括间距、任何非数字值、区号(您指定的)、电话号码应具有的值(数字)数量,还包括错误消息以及电话号码的旧状态和新状态。

Here is the source code:

这是源代码:

public class PhoneNumberValidator
{
    public string ErrorMessage { get; set; }
    public int PhoneNumberDigits { get; set; }
    public string CachedPhoneNumber { get; set; }

    private Dictionary<int, string> VaildAreaCodes()
    {
        return new Dictionary<int, string>
        {
            [3] = "0",
            [4] = "27"
        };
    }

    private bool IsInteger(string value)
    {
        return int.TryParse(value, out int result);
    }

    private string GetConsecutiveCharsInPhoneNumberStr(string phoneNumber)
    {
        switch (PhoneNumberDigits)
        {
            case 0:
            case 10:
                PhoneNumberDigits = 10;
                return phoneNumber.Substring(phoneNumber.Length - 7);

            case 11:
                return phoneNumber.Substring(phoneNumber.Length - 8);

            default:
                return string.Empty;
        }
    }

    private bool IsValidAreaCode(ref string phoneNumber, string areaCode)
    {
        if (!IsInteger(areaCode))
        {
            ErrorMessage = "Area code characters of Phone Number value should only contain integers.";
            return false;
        }

        var areaCodeLength = areaCode.Length;
        var invalidAreaCodeMessage = "Phone Number value contains invalid area code.";
        switch (areaCodeLength)
        {
            case 2:
                phoneNumber = string.Concat("0", phoneNumber);
                return true;

            case 3:
                if (!areaCode.StartsWith(VaildAreaCodes[3]))
                    ErrorMessage = invalidAreaCodeMessage;
                return string.IsNullOrWhiteSpace(ErrorMessage) ? true : false;

            case 4:
                if (areaCode.StartsWith(VaildAreaCodes[4]))
                {
                    phoneNumber = string.Concat("0", phoneNumber.Remove(0, 2)); // replace first two charaters with zero
                    return true;
                }                    
                ErrorMessage = invalidAreaCodeMessage;
                return false;                

            default:
                ErrorMessage = invalidAreaCodeMessage;
                return false;
        }
    }   

    public bool IsValidPhoneNumber(ref string phoneNumber)
    {
        CachedPhoneNumber = phoneNumber;

        if (string.IsNullOrWhiteSpace(phoneNumber))
        {
            ErrorMessage = "Phone Number value should not be equivalent to null.";
            return false;
        }

        phoneNumber = Regex.Replace(phoneNumber, " {2,}", string.Empty); // remove all whitespaces
        phoneNumber = Regex.Replace(phoneNumber, "[^0-9]", string.Empty); // remove all non numeric characters

        var lastConsecutiveCharsInPhoneNumberStr = GetConsecutiveCharsInPhoneNumberStr(phoneNumber);

        if (string.IsNullOrWhiteSpace(lastConsecutiveCharsInPhoneNumberStr))
        {
            ErrorMessage = "Phone Number value not supported.";
            return false;
        }

        if (!IsInteger(lastConsecutiveCharsInPhoneNumberStr))
        {
            ErrorMessage = "Last consecutive characters of Phone Number value should only contain integers.";
            return false;
        }

        var phoneNumberAreaCode = phoneNumber.Replace(lastConsecutiveCharsInPhoneNumberStr, "");

        if (!IsValidAreaCode(ref phoneNumber, phoneNumberAreaCode))
        {
            return false;
        }            

        if (phoneNumber.Length != PhoneNumberDigits)
        {
            ErrorMessage = string.Format("Phone Number value should contain {0} characters instead of {1} characters.", PhoneNumberDigits, phoneNumber.Length);
            return false;
        }

        return true;
    }
}

The solution is highly configurable and may be used for any digits phone number as well as area code.

该解决方案是高度可配置的,可用于任何数字电话号码以及区号。

回答by Bolorunduro Winner-Timothy

Expanding upon one of the answers provided above, the method I came up with to also handle a few phone number delivery styles as well as international phone number is

扩展上面提供的答案之一,我想出的方法还可以处理一些电话号码递送方式以及国际电话号码

    internal static bool IsValidPhoneNumber(this string This)
    {
        var phoneNumber = This.Trim()
            .Replace(" ", "")
            .Replace("-", "")
            .Replace("(", "")
            .Replace(")", "");
        return Regex.Match(phoneNumber, @"^\+\d{5,15}$").Success;
    }