Добро пожаловать на SO. Мне интересно, не проще ли вам и пользователю просто потребовать 10 номеров, связанных с номером телефона, а не те же 10 номеров в определенном формате?
Например, один пользователь может дать вам 5559140200, а другой - (555) 914-0200. Возможно, формат достаточно тривиален, чтобы его игнорировать, что позволяет вам просто проверить числовую последовательность, а не сосредоточиться на том, какое форматирование может присутствовать или не присутствовать? Таким образом, вы можете ограничить текстовое поле только числовым вводом и ограничить минимум 10 символами.
Если вы хотите стандартизировать ввод для ввода в базу данных или сравнить со стандартизированной записью в базе данных, вы можете взять их последовательность из 10 чисел, отформатировать ее после ее предоставления, затем записать или сравнить. Таким образом, ни вы, ни ваши пользователи не связаны жесткостью при вводе, и вы можете просто применить это после нажатия клавиши ввода ...
String.Format("{0:(###)###-####}", 5559140200);
... чтобы эффективно достичь цели (555)914-0200 без регулярных выражений.
Если это не то, к чему вы стремитесь, возможно, другой шаблон регулярных выражений ...
Regex Regphone = new Regex(@"\([0-9]{3}\)[0-9]{3}\-[0-9]{4}");
Как было запрошено в комментариях, ниже приведен пример маршрута String.Format (), который уменьшает выбрасываемые исключения ...
using System;
using System.Text.RegularExpressions;
using System.Windows.Forms;
namespace phone_number_sanitizer
{
public partial class Form1 : Form
{
#region Variables
string phonenumber = "";
string[] msg = new string[] { "Enter a valid phone number.", "Other messages you may wish to include." }; // referenced by array index
#endregion
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
#region UI Setup
txtPhone.MaxLength = 10;
btnSubmit.Enabled = false;
#endregion
}
private void txtPhone_TextChanged(object sender, EventArgs e)
{
/*
txtPhone's MaxLength is set to 10 and a minimum of 10 characters, restricted to numbers, is
required to enable the Submit button. If user attempts to paste anything other than a numerical
sequence, user will be presented with a predetermined error message.
*/
if (txtPhone.Text.Length == 10) { btnSubmit.Enabled = true; } else { btnSubmit.Enabled = false; }
if (Regex.IsMatch(txtPhone.Text, @"[^0-9]"))
{
DialogResult result = MessageBox.Show(msg[0], "System Alert", MessageBoxButtons.OK);
if (result == DialogResult.OK)
{
txtPhone.Text = "";
txtPhone.Focus();
btnSubmit.Enabled = false;
}
}
}
private void txtPhone_KeyPress(object sender, KeyPressEventArgs e)
{
/*
Here, you check to ensure that an approved key has been pressed. If not, you don't add that character
to txtPhone, you simply ignore it.
*/
if (Regex.IsMatch(e.KeyChar.ToString(), @"[^0-9]") && e.KeyChar != (char)Keys.Back) { e.Handled = true; }
}
private void btnSubmit_Click(object sender, EventArgs e)
{
/*
By this phase, the Submit button could only be enabled if user provides a 10-digit sequence. You will have no
more and no less than 10 numbers to format however you need to.
*/
try
{
phonenumber = String.Format("{0:(###)###-####}", txtPhone.Text);
}
catch { }
}
}
}
Комбинация управления вводом последовательности чисел с автоматическим форматированием непосредственно в текстовом поле выглядит следующим образом:
using System;
using System.Text.RegularExpressions;
using System.Windows.Forms;
namespace phone_number_sanitizer
{
public partial class Form1 : Form
{
#region Variables
string phonenumber = "";
string[] msg = new string[] { "Enter a valid phone number.", "Other messages you may wish to include." };
#endregion
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
#region UI Setup
txtPhone.MaxLength = 13;
btnSubmit.Enabled = false;
#endregion
}
private void txtPhone_TextChanged(object sender, EventArgs e)
{
if (txtPhone.Text.Length == 10 && Regex.IsMatch(txtPhone.Text, @"[0-9]")
{
btnSubmit.Enabled = true;
txtPhone.Text = txtPhone.Text.Insert(6, "-").Insert(3, ")").Insert(0, "(");
txtPhone.SelectionStart = txtPhone.Text.Length;
txtPhone.SelectionLength = 0;
}
else if (txtPhone.Text.Length == 13 && Regex.IsMatch(txtPhone.Text, @"\([0-9]{3}\)[0-9]{3}\-[0-9]{4}"))
{
btnSubmit.Enabled = true;
}
else
{
btnSubmit.Enabled = false;
txtPhone.Text = txtPhone.Text.Replace("(", "").Replace(")", "").Replace("-", "");
txtPhone.SelectionStart = txtPhone.Text.Length;
txtPhone.SelectionLength = 0;
}
}
private void txtPhone_KeyPress(object sender, KeyPressEventArgs e)
{
if (Regex.IsMatch(e.KeyChar.ToString(), @"[^0-9]") && e.KeyChar != (char)Keys.Back) { e.Handled = true; }
}
private void btnSubmit_Click(object sender, EventArgs e)
{
try
{
phonenumber = txtPhone.Text;
}
catch { /* There's nothing to catch here so the try / catch is useless. */}
}
}
}
Это немного сложнее, и вы получаете из текстового поля именно то, что вы хотите, не полагаясь на то, что пользователь даст вам это. Благодаря этой альтернативе ваши пользователи могут либо вводить свои 10-значные номера телефонов и выполнять форматирование динамически, либо они могут вставлять номера, которые соответственно отформатированы, т.е. "(555) 941-0200". Любой из вариантов активирует кнопку отправки.
Обе эти опции представлены, чтобы позволить вам контролировать вход. Иногда лучше устранить потенциальные ошибки ввода, чем выдавать сообщения об ошибках при их возникновении. С их помощью пользователь никак не сможет предоставить вам что-либо, кроме простой 10-значной числовой последовательности или отформатированного 10-значного номера телефона, и вы получите именно то, что вам нужно, без каких-либо хлопот.