【问题标题】:Regular Expressions in C# kill programC# kill 程序中的正则表达式
【发布时间】:2026-01-01 21:00:01
【问题描述】:

我正在为一个班级编写一个程序,当我运行它并在 txtSSN 控件中键入无效的内容时,它会冻结并崩溃。我想不通,因为我有另一个非常相似的项目,效果很好。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace VitalStatistics
{
    public partial class frmVitalStatistics : Form
    {
        #region Declarations

        const String AppTitle = "Vital Statistics";
        const float hoursOffset = 24.999F;

        Regex ssnRegex;

        #endregion

        #region Constructors
        public frmVitalStatistics()
        {
            InitializeComponent();
        }
    #endregion

        #region Event Handlers

       private void frmVitalStatistics_Load(object sender, EventArgs e)
        {

         // Initialize SSN input control
            RegexOptions options = RegexOptions.IgnorePatternWhitespace;
            string pattern = @"\A\d{3}-\d{3}-\d{4}\Z";
            ssnRegex = new Regex(pattern, options);

         // Init. Gender controls
            optGender = Gender.Unassigned;

            rbFemale.Tag = Gender.Male;
            rbMale.Tag = Gender.Female;

         // Init dtpBirth controls
            dtpBirth.MinDate = DateTime.Today;
            dtpBirth.MaxDate = DateTime.Today.AddHours(hoursOffset);
            dtpBirth.Value = DateTime.Today;

        }

       private void btnSubmit_Click(object sender, EventArgs e)
        {

            string name = String.Empty;
            string ssn = String.Empty;
            int length = 0;
            int weight = 0;

            DateTime birthDate = DateTime.MinValue;
            Gender gender = Gender.Unassigned;

           //Gather inputs

           if (GetName(ref name) &&
               GetSSN(ref ssn) &&
               GetLength(ref length) &&
               GetWeight(ref weight) &&
               GetGender(ref gender) &&
               GetBirthDate(ref birthDate))
           {
               //submit & close
               string format = 
                   "Thank you for submitting your contact information. \n\n" +
                   "Name: {0}\n" +
                   "SSN: {1}\n" +
                   "Length: {2}\n" +
                   "Weight: {3}\n" +
                   "Gender: {4}\n" +
                   "Birth Date & Time: {5:D}\n";

               string msg = String.Format(format, name, ssn, length, weight, gender, birthDate);
               MessageBox.Show(msg,AppTitle);
               Close();
           }
       }



       private Gender optGender;
       private void Gender_CheckedChanged(object sender, EventArgs e)
       {
           RadioButton rb = (RadioButton)sender;
           optGender = (rb.Checked ? (Gender)rb.Tag : Gender.Unassigned);
       }

        #endregion

        #region Implementation

        bool GetName(ref string name)
       {
           if (String.IsNullOrWhiteSpace(txtName.Text))
           {
               txtName.SelectAll();
               txtName.Focus();
               ShowError("Please enter your name.\n Names cannot consist of whitespace.");

               return false;
           }

           name = txtName.Text.Trim();

           return true;
       }

        bool GetSSN(ref string ssn)
       {
           txtSSN.Text = txtSSN.Text.Trim();

           Match match = ssnRegex.Match(txtSSN.Text);

           if (!match.Success)
           {
               txtSSN.SelectAll();
               txtSSN.Focus();
               ShowError("Unrecognized format for SSN. Please enter in the following format: 000-000-0000.");
               return false;

           }

           ssn = txtSSN.Text;
           return true;
       }

        bool GetLength(ref int length)
       {
           int value;
           try
           {
               if (String.IsNullOrWhiteSpace(txtLength.Text))
                   throw new ArgumentException("Field cannot be empty or contain spaces.");

               value = int.Parse(txtLength.Text);

           }
           catch (Exception ex)
           {
               // Select text and set focus
               txtLength.SelectAll();
               txtLength.Focus();

               // Set up error Message
               string msg = String.Format("{0}", ex);

               ShowError(ex.Message);
               return false;
           }

           length = value;
           return true;
       }

        bool GetWeight(ref int weight)
        {
            int value;
            try
            {
                if (String.IsNullOrWhiteSpace(txtWeight.Text))
                    throw new ArgumentException("Field cannot be empty or contain spaces.");

                value = int.Parse(txtLength.Text);

            }
            catch (Exception ex)
            {
                // Select text and set focus
                txtWeight.SelectAll();
                txtWeight.Focus();

                // Set up error Message
                string msg = String.Format("{0}", ex);

                ShowError(ex.Message);
                return false;
            }

            weight = value;
            return true;
        }

        bool GetGender(ref Gender gender)
        {
            if (optGender == Gender.Unassigned)
            {
                ShowError("Select a Gender.");
                return false;
            }
            gender = optGender;
            return true;
        }

        bool GetBirthDate(ref DateTime birthDate)
        {
           birthDate = dtpBirth.Value;
           return true;
        }

        void ShowError(string msg)
        {
           MessageBox.Show(msg, AppTitle, MessageBoxButtons.OK, MessageBoxIcon.None);
        }

         #endregion



    }



}

【问题讨论】:

  • 只需将其粘贴到 SO 上并缩进 4 个空格……让我们点击毫无意义。
  • 另外,我什至没有在这里看到正则表达式,但我怀疑这不是你的问题。正则表达式不会随机崩溃程序。如果正则表达式格式错误,他们可能会抛出异常。正则表达式模式不是从用户输入生成的,是吗?
  • 您是否已单步执行代码?为什么要发布那个大块而不告诉我们错误是什么?至少你应该能够告诉我们,究竟是哪一行导致程序崩溃。
  • @kfurz:如果您在该行的正上方而不是在frm..._Load 函数中初始化ssnRegex,会发生什么?
  • @kfruz:我会检查以确保 frmVitalStatistics_Load 正在运行。 ssnRegex 变量未初始化。我已经有一段时间没有在 winforms 中工作了,但我要做的第一件事是检查它初始化的函数是否正在执行。

标签: c# regex


【解决方案1】:

从 cmets 和代码来看,听起来好像您没有将事件处理程序 frmVitalStatistics_Load 连接到表单的加载事件。这将导致空指针异常,这与您看到的错误一致。

【讨论】:

    【解决方案2】:

    根据我对 OP 的 cmets,如果 frmVitalStatistics_Load 未运行,则它可能无法正确连接为事件处理程序。

    【讨论】:

      【解决方案3】:

      我无法通过您发布的代码重现您看到的错误。您的 frmVitalStatistics.Designer.cs 文件中的某些内容可能与我想出的不同。

      正如其他人所说,这可能是一个丢失的事件,或者可能是一个不需要的额外事件。

      这些是我在表单中关联的唯一事件。

      this.rbMale.CheckedChanged += new System.EventHandler(this.Gender_CheckedChanged);
      this.rbFemale.CheckedChanged += new System.EventHandler(this.Gender_CheckedChanged);
      this.btnSubmit.Click += new System.EventHandler(this.btnSubmit_Click);
      this.Load += new System.EventHandler(this.frmVitalStatistics_Load);
      

      检查您的 frmVitalStatistics.Designer.cs 并查看您是否有其他任何内容,或者是否缺少其中任何一个。

      一个问题...是在您输入时还是在单击提交后冻结?

      【讨论】: