Как подтвердить номер телефона
Действительный номер телефона содержит:
менее 9 символов,
"+" в начале,
и только цифры.
Я пытаюсь использовать регулярные выражения, но я только начал их использовать, и я не очень хорош в этом. Код, который у меня есть до сих пор:
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();
}
Но я не знаю, как проверить длину строки таким образом. Любая помощь приветствуется.
Ответы
Ответ 1
Регулярное выражение 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;
}
}
Ответ 2
Ваше регулярное выражение должно выглядеть так: вам нужна информация о char counter
@"^(\+[0-9]{9})$"
Ответ 3
Что-то вроде этого может работать:
^ +\{d} 0,9
Но я бы предложил поиграть с тестером регулярных выражений, чтобы узнать больше о том, как работают регулярные выражения. Я все еще люблю использовать их в себе, поскольку я часто не пишу регулярных выражений. Вот один пример, но есть еще много.
https://regex101.com/
Ответ 4
Простая функция для Valid 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);
}
Ответ 5
НЕ ИСПОЛЬЗУЙТЕ РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ!
Слишком много переменных для регулярного выражения. Вместо этого просто удалите все символы из вашей строки, которые не являются 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]+", "");
}
}
Ответ 6
Если вы ищете специальное выражение для конкретной страны, попробуйте это выражение, которое работает для всех австралийских (+ 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
}
Ответ 7
Это решение проверяет все критерии тестирования для проверки номера телефона, а также использует API-интерфейс Regex. Критерии включают в себя интервалы, любые не числовые значения, коды областей (которые вы указываете), количество значений (цифр), которые должен иметь номер телефона, а также включают сообщения об ошибках, а также номер телефона в старом и новом состоянии.
Вот исходный код:
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;
}
}
Решение очень настраивается и может использоваться для любого номера телефона, а также для кода области.