Что не так с этими регулярными выражениями и исключениями? - PullRequest
1 голос
/ 21 марта 2019

Это обновление к старому вопросу.Я делаю приложение формы Windows, чтобы запросить контактную информацию.Я создал класс для обрезки входного текста и проверки, является ли текстовое поле пустым.Я также назначил шаблоны для электронной почты и номера телефона.Однако текст не соответствует регулярному выражению и не перехватывает никаких исключений.

форма имеет только одну кнопку, и она должна компилировать и представлять информацию, вставленную в текстовое поле.

Я использовал запрос Getметод для строк, собранных из текстового поля.

  bool GetPhone(ref string phonenumber)
    {
        bool success = true;
        try
        {
            txtPhone.Text=Input.TrimText(txtPhone.Text);
            if (Input.IsTextEmpty(txtPhone.Text))
                throw new InputRequiredException();

            phonenumber = txtPhone.Text;
            Regex Regphone = new Regex(@"^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$");
            Match matchphone = Regphone.Match(phonenumber);
            if (matchphone.Success)
                success = true;
            else throw new InputRequiredException();
        }
        catch(Exception error)
        {
            string remediation = "Enter a valid phone number.";
            Input.ShowError(error, remediation);
            Input.SelectText(txtPhone);
        }
        try
        {
            int Phone = Convert.ToInt32(txtPhone.Text);

            success = true;
        }
        catch (Exception error)
        {
            string remediation = "Enter a valid phone number.";
            Input.ShowError(error, remediation);
            Input.SelectText(txtPhone);

        }
            return success;
    }

И класс.

 class Input
{
 static public string TrimText(string A)
{
    return A.Trim();
}

internal static bool IsTextEmpty(string A)
{
    if (string.IsNullOrEmpty(A))
    {
        return true;
    }

    else
    {
        return false;
    }
}

internal static void ShowError(object error, string remediation)
{

}

static public void SelectText(TextBox textBox1)
{
     textBox1.SelectAll();
}
}

Исключительный класс

 internal class InputRequiredException : Exception
{
    public InputRequiredException()
    {
    }

    public InputRequiredException(string message) : base(message)
    {
        message = "Invalid Input.";
    }

    public InputRequiredException(string message, Exception innerException) : base(message, innerException)
    {
    }

    protected InputRequiredException(SerializationInfo info, StreamingContext context) : base(info, context)
    {
    }
}

Нет ошибок, отображаемых в кодеи программа работает гладко, но я не получаю желаемый результат.Мне нужно, чтобы текстовое поле номера телефона подтвердило ввод и выдало исключение, если оно неверно.В настоящее время текстовое поле принимает все без исключения значения.Я абсолютный нуб, когда дело доходит до кодирования, и понимаю, что в коде могут быть логические ошибки.Независимо от того, есть ли одна или несколько ошибок, или если код просто не завершен, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 22 марта 2019

Добро пожаловать на 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-значного номера телефона, и вы получите именно то, что вам нужно, без каких-либо хлопот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...