اعتبار سنجی با استفاده از عبارات با قاعده

استفاده از عبارات با قاعده یکی از راه‌های عالی برای اعتبار سنجی داده‌هایی است که توسط کابر وارد فیلد یک فرم می‌شوند. فرض کنید که یک کاربر در فیلد مربوط به سن، نام و در فیلد مربوط به آدرس، جنسیت خود را وارد کند، در این حالت شما می‌توانید با استفاده از عبارات باقاعده از بروز خطا جلوکیری کنید. با استفاده از برنامه زیر که یک برنامه ویندوزی است نحوه استفاده از عبارات با قاعده و اعتبار سنجی فیلدهای یک فرم نشان داده شده است. یک برنامه ویندوزی ایجاد کنید و نام آن را RegexValidation بگذارید.
regex-validation-1001

برچسب نوع نام مقدار
1 Label firstNameTextBox
2 Label lastNameTextBox
3 Label ageTextBox
4 Label genderTextBox
5 Label addressTextBox
6 Label zipCodeTextBox
7 Button submitButton Text Submit

با وجودیکه می‌توان از کنترل radio buttons برای مشخص نمودن جنسیت کاربر استفاده شود ولی در اینجا برای آموزش استفاده از عبارات باقاعده و اعتبار سنجی ما از کنترل textBox استفاده می‌کنیم. بر روی submitButton دو بار کلیک کنید تا یک کنترل کننده رویداد برای رویداد کلیک آن ایجاد شود. مطمئن شوید که در قسمت تعاریف فضاهای نامی، فضای نام System.Text برای استفاده ازکلاس StringBuilder و System.Text.RegularExpressions برای استفاده از کلاس Regex وارد شده باشند.

using System.Text;
using System.Text.RegularExpressions;

حال باید اعضای StringBuilder و Regex را در کلاس برنامه‌مان تعریف کنیم.

private StringBuilder errors;
private Regex validator;

کد زیر را در قسمت کنترل کننده رویداد کلیک مربوط به کنترل submitButton بنویسید.

private void submitButton_Click(object sender, EventArgs e)
{
    if (AreFieldsValid())
    {
        //Do task here
    }
}

با کلیک بر روی این کنترل متد AreFieldsValid() فراخوانی می‌شود. این متد را برای چک کردن هر فیلد جهت یافتن خطا ایجاد می‌کنیم. این متد هنگامی که خطایی وجود نداشته باشد مقدار true و اگر خطایی وجود داشته باشد مقدار false را بر می‌گرداند. کد این متد به صورت زیر است :

   1: private bool AreFieldsValid()
   2: {
   3:     errors = new StringBuilder();
   4: 
   5:     //Validate First Name and Last Name
   6:     validator = new Regex(@"^([A-Z][a-z]+)(s[A-Z][a-z]+)*$");
   7: 
   8:     if (!validator.Match(firstNameTextBox.Text).Success)
   9:         errors.AppendLine("First name is not in the proper format.");
  10: 
  11:     if (!validator.Match(lastNameTextBox.Text).Success)
  12:         errors.AppendLine("Last name is not in the proper format.");
  13: 
  14:     //Validate Age
  15:     validator = new Regex(@"^d{1,2}$");
  16: 
  17:     if (!validator.IsMatch(ageTextBox.Text))
  18:         errors.AppendLine("Invalid Age.");
  19: 
  20:     //Validate Gender
  21:     validator = new Regex(@"^([M|m]ale|[F|f]emale)$");
  22: 
  23:     if (!validator.IsMatch(genderTextBox.Text))
  24:         errors.AppendLine("Invalid Gender.");
  25: 
  26:     //Validate Address
  27:     validator = new Regex(@"^[0-9]+(s[a-zA-Z]+)+$");
  28: 
  29:     if (!validator.IsMatch(addressTextBox.Text))
  30:         errors.AppendLine("Address is not in the proper format.");
  31: 
  32:     //Validate ZipCode
  33:     validator = new Regex(@"^d{4}$");
  34: 
  35:     if (!validator.IsMatch(zipCodeTextBox.Text))
  36:         errors.AppendLine("Invalid zip code");
  37: 
  38:     if (errors.ToString() == String.Empty)
  39:     {
  40:         return true;
  41:     }
  42:     else
  43:     {
  44:         MessageBox.Show(errors.ToString(), "Validation Failed", 
  45:             MessageBoxButtons.OK, MessageBoxIcon.Error);
  46: 
  47:         return false;
  48:     }
  49: }

در خط 3 یک نمونه از کلاس StringBuilder ایجاد شده است. سازنده پیشفرض این کلاس یک رشته خالی را ایجاد می‌کند. در خط 6 یک نمونه از از عبارات با قاعده برای نام و نام خانوادگی ایجاد شده است. از آنجاییکه دو فیلد نام و نام خانوادگی دارای نمونه یکسانی هستند پس می‌توان به راحتی از عبارت باقاعده مشابهی استفاده کرد. در خطوط 8 و 11 اعتبار نام و نام خانوادگی که توسط کاربر وارد شده است توسط متد Match() از کلاس Regex چک می‌شود. متد Match() یک شیء از نوع کلاس Match را بر می‌گرداند. این کلاس یک خاصیت به نام success دارد که تعیین می‌کند که رشته موجود با الگو مطابقت دارد یا خیر. در صورتیکه رشته با الگو مطابقت نداشته باشد با استفاده از متد AppendLine() کلاس StringBuilder یک پیغام به متغیر errors اضافه می‌کنیم. این پیغام بعد از پایان اعتبار سنجی به کاربر نمایش داده می‌شود. در خط 15 شیء Regex دیگری با الگوی جدید برای اعتبار سنجی سن ایجاد می‌کنیم. در خط 17، از متد IsMatch() کلاس Regex به جای متد ()Match استفاده کرده‌ایم، هدف هر 2 متد یکسان است. اگر رشته با الگو مطابقت داشته باشد مقدار true و در غیر این صورت مقدار false بر گردانده می‌شود. در حالت کلی برای هر فیلد یک شیء Regex با الگوی متفاوت می‌سازیم. اگر فیلد با الگو مطابقت نداشته باشد یک پیغام خطا به متغیر errors اضافه می‌شود. بعد از اینکه تمامی فیلدها را اعتبار سنجی کردیم، در خط 38 بررسی می‌کنیم که آیا متغیر errors خالی است یا نه. اگر مقدار errors ،empty باشد نمایانگر این است که تمامی فیلدها با الگوهایشان مطابقت دارند، در غیر این صورت ممکن است پیغام خطایی به شکل زیر به کاربر نمایش داده شود.
regex-validation-1002
با روش اعتبار سنجی با استفاده از کلاس regular expression آشنا شدید. تکنیک‌های بیشتری برای اعتبار سنجی وجود دارد، از جمله استفاده از کنترل ErrorProvider .