آموزش عبارت های منظم

آنچه در این صفحه می خوانید:

عبارت های منظم (Regex) چیست؟

یک عبارت منظم، regex یا regexp (گاهی اوقات یک عبارت منطقی خوانده می شود) دنباله ای از شخصیت هایی است که الگوی جستجو را تعریف می کنند. معمولاً چنین الگویی با الگوریتم های جستجوی رشته برای عملیات "find" یا "find and جایگزین" روی رشته ها یا برای اعتبار سنجی ورودی استفاده می شود. این تکنیکی است که در علوم نظری رایانه و نظریه زبان رسمی توسعه یافته است.

این مفهوم در دهه 1950 پدید آمد که ریاضیدان آمریکایی استفن کول کلین توضیحات یک زبان معمولی را رسماً رسمیت داد. این مفهوم با استفاده از ابزارهای پردازش متن یونیکس متداول شد. نحوهای مختلفی برای نوشتن عبارات منظم از دهه 1980 وجود داشته است که یکی از آنها استاندارد POSIX و دیگری با استفاده گسترده از آن، نحو Perl است.

عبارات منظم در موتورهای جستجو مورد استفاده قرار می گیرند، دیالوگ های پردازشگرها و ویرایشگرهای متن، در ابزارهای پردازش متن مانند sed و AWK و در تحلیل واژگانی را جستجو و جایگزین می کنند. بسیاری از زبان های برنامه نویسی قابلیت های regex را چه در داخل کتابخانه و چه از طریق کتابخانه ارائه می دهند.

regular expression به اختصار regex با معنای عبارت باقاعده، یک رشته از متن است که به شما امکان می دهد الگوهایی را ایجاد کنید که به آنها کمک بتوانید تا متناسب با تطابق، جایگذاری و مدیریت متن را انجام دهید. اگر با متن سروکار و نیاز به تجزیه مقدار زیادی از داده ها را دارید، تسلط بر عبارت باقاعده می تواند در زمان صرفه جویی کند. عبارت باقاعده متشکل از حروف و علامت‌های است که برای جستجو و مقایسه‌ی رشته‌ها کاربرد دارد. حدودا همه ی زبان های برنامه نویسی از  regex  پشتیبانی می کنند و استفاده از آن ها می‌تواند حجم کدنویسی را تا حدودی کاهش دهد. از عبارت با قاعده به منظور جستجوی عبارات در متن و جستجو و جایگزاری عبارت در متن بهره می گیریم.

کاربرد عبارت های منظم (Regex)

دنباله ای از نمادها و کاراکترهایی که رشته یا الگویی را برای جستجو در یک متن طولانی تر جستجو می کنند. یک عبارت منظم یک الگوی متنی است که از ترکیبی از شخصیت های الفبایی و کاراکترهای خاص معروف به metacharakter تشکیل شده است. در حقیقت یك نزدیك در حقیقت عبارت wildcard است كه اغلب در مدیریت پرونده استفاده می شود. این الگوی برای مطابقت با رشته های متن استفاده می شود. نتیجه یک مسابقه موفقیت آمیز است یا خیر، با این حال، اگر یک مسابقه موفقیت آمیز باشد، همه الگوی ها نباید مطابقت داشته باشند، این بعداً در مقاله توضیح داده می شود.

خواهید فهمید که عبارات منظم به سه روش مختلف استفاده می شوند: متن معمولی، جستجوی و جایگزینی و تقسیم. حالت دوم در اصل برابر است با مسابقه معکوس یعنی هر چیزی که بیان معمولی مطابقت ندارد.

اصطلاحات منظم معمولاً معمولاً regexes یا RE نامیده می شوند، اما برای قوام، من با نام کامل آن به آن اشاره خواهم کرد. به دلیل تطبیق پذیری عبارت منظم، از آن در پردازش متن و تجزیه بسیار استفاده می شود. کاربران یونیکس احتمالاً از طریق استفاده از برنامه ها، grep، sed، awk و ed با آنها آشنا هستند. ویرایشگرهای متنی مانند (X) Emacs و vi نیز از آنها به شدت استفاده می کنند. احتمالاً شناخته شده ترین کاربرد عبارات معمولی در زبان برنامه نویسی Perl است. متوجه می شوید که پرل پیشرفته ترین اجرای منظم بیان تا به امروز است.

می توان از عبارات منظم برای انجام انواع جستجوی متن و عملیات جایگزینی متن استفاده کرد.

عبارت های منظم (Regex) در پایتون

یک عبارت منظم دنباله خاصی از شخصیت هاست که با استفاده از یک ترکیب خاص که به صورت یک الگوی برگزار می شود، به شما کمک می کند رشته ها یا مجموعه های رشته دیگری را با یکدیگر هماهنگ کنید یا پیدا کنید. عبارات منظم در دنیای UNIX به طور گسترده ای مورد استفاده قرار می گیرد.

ماژول پایتون از عبارات منظم پرل مانند در پایتون پشتیبانی کامل می کند. اگر خطایی هنگام تدوین یا استفاده از یک عبارت معمولی رخ دهد، ماژول re re.error استثنا را افزایش می دهد. ما دو کارکرد مهم را پوشش می دهیم، که می توانند برای بیان عادی استفاده شوند. اما یک چیز کوچک در ابتدا: شخصیت های مختلفی وجود دارند که وقتی از آنها در بیان معمولی استفاده می شوند معنای ویژه ای دارند. برای جلوگیری از هرگونه سردرگمی هنگام مواجهه با عبارات منظم، از Raw Strings به عنوان r'expression استفاده می کنیم.

پایتون یک بسته داخلی به نام re دارد که می تواند برای کار با Regular Expressions استفاده شود.

وارد کردن ماژول مجدد:

import re

عبارت های منظم (Regex) در سی شارپ

سی شارپ از عبارات منظم از طریق کلاس در فضای نامی System.Text.RegularExpressions در چارچوب استاندارد NET پشتیبانی می کند. در حالی که تفاوتهایی در ویژگیهای پیشرفته پشتیبانی شده از کتابخانه عبارت منظم .NET در مقایسه با PCRE وجود دارد، هر دو بخش عمده ای از نحو را به اشتراک می گذارند و از الگوهای و عبارات می توان در زبانهای C # و سایر زبانها استفاده کرد.

در مثال های زیر، اگر می خواهید کد را وارد کنید، نامهای زیر را در بالای فایل منبع وارد کنید:

 using System.Text.RegularExpressions;

عبارت های منظم (Regex) در جاوااسکریپت

در جاوااسکریپت، یک عبارت معمولی به سادگی نوعی شیء است که برای مطابقت با ترکیب کاراکترها در رشته ها استفاده می شود.

دو روش برای ایجاد یک عبارت منظم وجود دارد:

عبارت منظم Literal - در این روش از slashes (/) برای محصور کردن الگوی Regex استفاده می شود:

var regexLiteral = /cat/;

سازنده عبارت منظم - این روش بیان را برای شما ایجاد می کند:

var regexConstructor = new RegExp("cat");

عبارت های منظم (Regex) در جاوا

عبارات منظم یک "زبان" ویژه برای نشان دادن الگوهای است که می خواهیم با رشته ها مطابقت داشته باشد. در صورت استفاده مناسب، آنها یک ویژگی بسیار قدرتمند جاوا و سایر زبان های برنامه نویسی هستند. با استفاده از API برای بیان مرتب جاوا، ما می توانیم کارهایی مانند موارد زیر را فقط در یک یا دو خط کد انجام دهیم:

  • تطبیق رشته و اعتبار سنجی: تعیین اینکه یک رشته داده شده با الگوی خاصی مطابقت دارد، به عنوان مثال که شماره تلفن یا آدرس پست الکترونیکی به درستی قالب بندی شده است.
  • تطبیق با معیارهای متغیر مانند حساس مورد در مقابل تطابق غیر حساس به مورد؛
  • تطبیق بستر یا جستجوی مواردی از یک بستر خاص در یک رشته بزرگتر.
  • استخراج داده ها: یافتن بسترهای به صورت خودکار با یک قالب خاص از یک رشته معین (به عنوان مثال کد کشور، پیش شماره گیری و شماره تلفن محلی از شماره تلفن کاملاً مشخص) استخراج شود.
  • عملیات را بیابید و جایگزین کنید، از جمله مواردی که رشته جایگزینی بسته به رشته ای که پیدا شده است متفاوت است.

همچنین اجتناب از خطوط گسترده کد، استفاده از عبارت معمولی API برای انجام این کارها همچنین می تواند بهینه سازی کارایی را برای ما به ارمغان بیاورد که احتمالاً در نظر نگرفته ایم اگر بخواهیم کد معادل آن را از ابتدا بنویسیم. همانطور که خواهیم دید، این موجزاری گاهی به قیمت خوانایی حاصل می شود. بنابراین بسیاری از برنامه نویسان با عبارات عادی رابطه عشق و نفرت دارند!

برای نشان دادن مزایا و مضرات استفاده از عبارات منظم، با یک مثال ساده شروع می کنیم.

تطبیق الگوی مثال: متن کد شده در مقابل عبارات معمولی

فرض کنید می خواهید به این سوال پاسخ دهید: آیا یک رشته داده شده شامل یک سری 10 رقمی است؟ می توانید این را کدگذاری کنید: از طریق کاراکترهای رشته تا زمانی که به رقمی ضربه بزنید چرخش کنید. سپس وقتی رقمی پیدا کردید، بررسی کنید که نه شخصیت بعدی رقم هستند. بنابراین در جاوا، کد چیزی شبیه به این است:

public boolean hasTenDigits(String s) {
  int noDigitsInARow = 0;
  for (int len = s.length(), i = 0; i < len; i++) {
    char c = s.charAt(i);
    if (Character.isDigit(c)) {
      if (++noDigitsInARow == 10) {
        return true;
      }
    } else {
      noDigitsInARow = 0;
    }
  }
  return false;
}

نظرتون درباره این نوشته چیه؟ عالیه بد نیست خوب نبود