[英]How to validate a (country specific) phone number
有效的电话号码包含:
我正在尝试使用正则表达式,但我才刚刚开始使用它们,而且我并不擅长。 我到目前为止的代码是:
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();
}
但我不知道如何以这种方式检查字符串的长度。 任何帮助表示赞赏。
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;
}
}
您的正则表达式应如下所示,您需要有关字符计数器的信息
@"^(\+[0-9]{9})$"
不要使用正则表达式!!
正则表达式的变量太多,没有任何用处。 相反,只需从字符串中删除所有非 0-9 的字符,然后检查是否剩余正确的位数。 那么用户包含或不包含什么额外的东西并不重要...... ()x-+[] 等,因为它只是将它们全部删除并且只计算字符 0-9。
我有一个很好用的字符串扩展,并且支持多种格式。 它接受一个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
这是代码(假设是 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]+", "");
}
}
扩展上面提供的答案之一,我想出的方法还可以处理一些电话号码交付方式以及国际电话号码
internal static bool IsValidPhoneNumber(this string This)
{
var phoneNumber = This.Trim()
.Replace(" ", "")
.Replace("-", "")
.Replace("(", "")
.Replace(")", "");
return Regex.Match(phoneNumber, @"^\+\d{5,15}$").Success;
}
这样的事情可以工作:
^+\\d{0,9}
但我建议使用 regex tester 来了解有关正则表达式如何工作的更多信息。 我自己仍然喜欢大量使用它们,因为我不经常编写正则表达式。 这是一个示例,但还有更多示例。
有效 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);
}
如果您正在寻找特定于国家/地区的正则表达式,请尝试这个适用于所有澳大利亚 (+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
}
此解决方案验证用于验证电话号码的每个测试标准,它还利用 Regex API。 标准包括间距、任何非数字值、区号(您指定的)、电话号码应具有的值(数字)数量,还包括错误消息以及电话号码的旧状态和新状态。
这是源代码:
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;
}
}
该解决方案是高度可配置的,可用于任何数字电话号码以及区号。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.