عبارت‌های منظم ترکیب‌هایی خاص از حروف و علامت‌ها هستند که برای جستجو و مقایسه‌ی رشته‌ها استفاده می‌شوند. این عبارت‌ها گاهی با نام «Regex» و گاهی با «Regexp» نیز شناخته می‌شوند. استفاده از این عبارت‌ها می‌تواند حجم کدنویسی را تا اندازه‌ی زیادی کاهش دهد. برای مثال ارزیابی ورودی کاربر برای شباهت به یک نشانی ایمیل یا جستجوی یک فایل برای یافتن شماره تلفن‌های موبایل با عبارت‌های منظم امکان‌پذیر است.

تقریبا تمام زبان‌های برنامه‌نویسی از Regex پشتیبانی می‌کنند یا این ویژگی با استفاده از کتابخانه‌های جانبی در آن‌ها امکان‌پذیر است. از آن جمله زبان‌های رایج برنامه‌نویسی وب مانند php، Javascript، و زبان‌های تحت سکوی ‎.Net می‌توانند عبارت‌های منظم را پردازش کنند.

برای شروع چند قانون ابتدایی را مرور می‌کنیم:

برای یافتن عبارت‌های حرفی و عددی ثابت، از همان عبارت استفاده می‌کنیم.

  • برای مثال برای یافتن عبارت «AMIB» در یک رشته‌ی بلند از همین عبارت استفاده می‌شود

نویسه‌های ترکیبی «‎\d» معادل یک «عدد»، «‎\s» معادل یک «فاصله» و «‎\w» معادل یک «حرف یا عدد انگلیسی» هستند.

  • برای مثال عبارت منظم «‎\d\d\d‎» می‌تواند معادل سه عدد مانند "123" یا "032" باشد.
  • عبارت منظم «‎\d\w\d‎» می‌تواند با "1h4" یا "3b6" یا هر ترکیب مشابه برابری کند.

نویسه‌ی نقطه «.» می‌تواند جایگزین هر حرفی باشد.

  • برای مثال عبارت «...» می‌تواند نماینده‌ی "abc" یا "123" یا "_a8" باشد
  • مثال دیگر: عبارت «‎a.\d‎» می‌تواند در یافتن عبارت‌های "ab9" یا "a99" یا "aa7" استفاده شود.

برای تعیین تکرار حروف چند علامت وجود دارد. علامت سوال "?"، علامت ستاره "*" و علامت مثبت "+". این سه علامت پس از گروه‌های حرفی قرار می‌گیرند و تعداد تکرار حرف قبل از خود را مشخص می‌کنند. علامت سوال به معنی «صفر یا یک»، علامت ستاره به معنی «صفر یا بیشتر» و علامت مثبت به معنی «یک یا بیشتر» هستند.

  • برای مثال عبارت منظم «‎\d+‎» می‌تواند معادل "2"، "43"، "092"، "321567" یا هر تعداد عدد باشد.
  • عبارت منظم «‎\d?abc‎» می‌تواند با رشته‌های "2abc"، "abc"، "0abc" برابر باشد.
  • عبارت منظم «‎a*bc‎» رشته‌های "bc"، "abc"، "aaaabc" را نمایندگی می‌کند.

قرار دادن گروهی از حروف درون کروشه «[]» معادل یکی از آن حروف است

  • عبارت «‎[abc123]‎» هر یک از حروف و اعداد داخل کروشه را معتبر می‌داند
  • عبارت «‎[abc]?20‎» می‌تواند در جستجوی عبارت‌های "a20" یا "b20" یا "c20" یا "20" استفاده شود
  • عبارت «‎09[123]\d+‎» می‌تواند شماره‌هایی که شبیه شماره‌ی موبایل هستند را بیابد. در ادامه این عبارت را کامل‌تر خواهیم کرد.

علامت پایپ «|» در عبارت به معنای «یا» کاربرد دارد.

  • به عنوان نمونه عبارت منظم «abc|def» یکی از رشته‌های "abc" یا "def" را جستجو می‌کند.

استفاده از پرانتز در اطراف گروهی از نویسه‌ها، می‌تواند دامنه‌ی عملکرد پایپ «|» را محدود کند.

  • برای مثال عبارت منظم «‎a(bc)|(de)‎» معادل "abc" یا "ade" خواهد بود.

برای مشخص کردن دقیق‌تر تکرار از علامت آکولاد «{}» کمک می‌گیریم. داخل آکولاد به سه شکل می‌توان اعداد را وارد کرد.
گونه‌ی نخست: یک عدد ساده برای تعداد دقیق تکرار: «‎{3}‎»
گونه‌ی دوم: دو عدد جدا شده با ویرگول برای تعیین حداقل و حداکثر: «‎{3,5}‎»
گونه‌ی سوم: یک عدد و یک ویرگول برای تعیین حداقل: «‎{3,}‎»

به چند مثال توجه کنید:

  • «‎\d{5}‎» معادل رشته‌ای با ۵ حرف عددی مانند: "12345" یا "09876"
  • «‎\d{5,10}‎» معادل رشته‌ای تشکیل شده از ۵ تا ۱۰ نویسه‌ی عددی مانند: "1234567" یا "1234567890"
  • «‎[abc]{5,}‎» معادل رشته‌ای تشکیل شده از نویسه‌های a، b یا c به طول حداقل ۵ حرف: "abcab" یا "cccaaabbb"
  • تشخیص شماره‌ی موبایل رایج در ایران: «‎09[123]\d{8}‎» به معنی عبارتی که با ۰۹ آغاز شود، یکی از عددهای ۱، ۲ یا ۳ را داشته باشد و ۸ عدد دیگر در در پایان آن بیایند.

داخل کروشه از چند علامت ویژه می‌توان کمک گرفت:
نخست علامت منفی برای تعریف دامنه‌ای از حروف یا اعداد مانند: «‎[a-z]‎» یا «‎[b-f0-9]‎»
علامت Caret «^» در ابتدای کروشه برای به حساب نیاوردن حروف داخل کروشه: «‎[^a-z]‎» : هر نویسه‌ای به جز دامنه‌ی a تا z
علامت نقطه درون کروشه فقط نویسه‌ی نقطه «.» را پیدا می‌کند.

برای یافتن علامت‌های استفاده شده در قوانین عبارت منظم( مانند پرانتز، کروشه و نقطه ) از علامت ممیز وارو قبل از آن‌ها استفاده می‌شود

  • مثال: یافتن رشته‌ی «‎(abc)‎» با عبارت منظم «‎\(abc\)‎» امکان‌پذیر است
  • یافتن رشته‌ی «‎[0-9]‎» با عبارت منظم «‎\[0-9\]‎» قابل انجام است

۲۴ نظر در مورد «آشنایی با عبارت‌های منظم( Regular Expressions )»

  • ممنون عالی بود
    میخواستم بدونم علامت های زیر به چه معنا هستند؟
    ؟:
    ؟!
    ؟=
    ؟()
    کلا علامت سوال + علامت دیگه
    خیلی ممنون میشم راهنمایی کنید

    • امیرمسعود ایرانی می‌گوید:

      سلام

      علامت سوال به همراه «دونقطه» داخل پرانتز کاربرد دارد
      در حالت عادی پرانتز باعث می‌شود تا بخش داخل پرانتز یک متغیر به حساب آید که به صورت جداگانه قابل دسترس است
      اگر علامت سوال و دونقطه ابتدای پرانتز قرار بگیرد، دیگر متغیری ایجاد نمی‌شود

      علامت سوال به همراه علامت تعجب هم داخل پرانتز استفاده می‌شود
      این علامت به معنی این است که عبارت داخل پرانتز در ادامه وجود نداشته باشد
      خود عبارت داخل پرانتز جزئی از نتیجه نخواهد بود و تنها شرطی است که بخش‌های قبلی صحیح به حساب بیایند

      علامت سوال به همراه مساوی نیز داخل پرانتز به این معنی است که کل عبارت در صورتی صحیح به حساب آید
      که عبارت داخل پرانتز در ادامه وجود داشته باشد ولی خودش بخشی از عبارت به حساب نیاید

      این صفحه هم مثال‌هایی در این زمینه دارد:
      چند مثال از عبارت‌های منظم

  • سلام
    اگر بخوام در کل فایل بگردم و یک Div رو که مثلا id="test" هست رو پیدا کنم و کل محتویات بین این تگ رو در یک رشته کپی کنم باید چکار کنم؟
    این تگ ممکنه در هر کجای فایل قرار داشته باشه

    • امیرمسعود ایرانی می‌گوید:

      سلام

      بدون داشتن نمونه‌ی کامل ممکنه خطایی در طراحی عبارت منظم به وجود بیاد
      به علاوه با کمک عبارت‌های منظم امکان شمارش تعداد تگ‌ها وجود نداره بنابراین اگر داخل تگ div یک تگ div دیگر باشد استفاده از عبارت‌های منظم ناممکن خواهد بود
      با توجه به موارد بالا چیزی شبیه کد زیر ممکنه کار شما رو حل کنه

      <div[^>]+?id=['"]test['"][^>]*>([^<]+?)</div>
    • امیرمسعود ایرانی می‌گوید:

      با سلام
      عبارت‌های منظم رو به شکل‌های مختلفی می‌شه طراحی کرد. با توجه به اینکه من قانون دقیق در مورد حرف‌های به کار رفته در عبارت شما رو نمی‌دونم، سعی کردم چیزی طراحی کنم که با بیشترین احتمال شما رو به هدف برسونه
      اگه از یک نرم‌افزار یا سایت که بتونه عبارت‌های منظم رو به صورت تصویری بهتون نشون بده، کمک بگیرید، خودتون می‌تونید به راحتی خطاهای احتمالی رو اصلاح کنید
      عبارت زیر یک متغیر می‌سازه که همون بخش مورد نظر شماست. با استفاده از ‎\1 یا ‎$1 بسته به زبان برنامه‌نویسی هدفتون می‌تونید بهش دسترسی پیدا کنید.

      ((.+?(.+?(.+?((.+?)).+?)
  • سلام
    با تشکر از راهنماییتون میخواستم یه خط از فایل رو بخونم مثل
    (glVertex3f (0.25, 0.25, 0.0
    و اعدادش رو جدا کنم چطوری باید انجام بدم

  • با سلام و خسته نباشید من میخوام یک expression بنویسم که فقط شامل اعداد و حروف و کاراکترهای </-_ باشد و کاراکترهای !@#$%&`~'"{}() در آن وجود نداشته باشند الان دو روز است که دارم روزش کار میکنم ولی هرجور مینویسم یه جاش میلنگه.
    /^([^\!\@\#\$\%\*\(\)\`\~]*)([\\/\_\-]*)([^\!\@\#\$\%\*\(\)\`\~]*)([a-zA-Z0-9]*)([\\/\_\-]*)([a-zA-Z0-9]*).{6,30}$/

    • امیرمسعود ایرانی می‌گوید:

      با سلام

      لطفا از سایتی که در این نوشته معرفی شده است استفاده کنید
      با رسم نمودار عبارت منظم می‌توانید متوجه بشوید که کدام بخش ایراد دارد
      می‌توانید قدم به قدم عبارت را بزرگ و کامل کنید تا به نتیجه برسید

  • با سلام
    عبارتی می خوام شامل همه کاراکترها و کلید اینتر که مجموعا 400 کاراکتر بیشتر نشه. میشه عبارت را راهنمایی بفرمایید؟

    • امیرمسعود ایرانی می‌گوید:

      با سلام

      اگر مطالب بالا را مطالعه می‌فرموید، نوشتن این عبارت کار دشواری نبود:

      /[sS]{0,400}/

      البته فیلتر کردن یک عبارت بر اساس طول با استفاده از عبارت‌های منظم روش خوبی نیست مگر اینکه راه حل دیگری نباشد

  • بسیار عالی
    یه سوال دارم که متوجه نمیشم باید پیکار براش بکنم

    من می خوام وقتی یه کلمه رو از داخل یه متنی پیدا میکنم اون کلمه تنها باشه

    مثلا من دنبال کلم بروکلی میگردم [ا-ی]{3}\s[ا-ی]{6} با این کد پیداش می کنم

    ولی یه سری چیزای دیگه مثل رفس پرورشی هم از تو متن میاد که اصل کلمش کرفس پرورشی هست

    با چه کدی میشه اینو محدود کرد فقط اصل کلمه اون چیزی که من میخوام رو بیاره

  • سلام من دارم یک کامپایلر طراحی میکنم با زبان flex توی نوشتن عبارت با قاعده دوتا از متغیر هام گیر کردم میشه کمکم کنید
    char-constant شامل یک کاراکتر میان گیومه (') .همچنین کاراکترهایی مانند newline نیز با \ بکار میروند
    بطور مثال اینارو میپذیره 'A' 'b' '+' '\n' '\t' '\\' '\b'
    و اینارو نه ''' '”' ' \
    ممنونمیشم کمکم کنید

    • امیرمسعود ایرانی می‌گوید:

      با سلام
      برای اینکه بتوانید عبارت‌های باقاعده را به خوبی طراحی کنید می‌توانید از ابزارهای کمکی مانند این کمک بگیرید
      نمونه‌ای که شما نیاز دارید چیزی شبیه این عبارت خواهد بود

      '(?:[a-zA-Z]|[ntb])'

      نکته‌ی قابل توجه در مورد کد بالا اینکه عبارت ?: داخل پرانتز برای این درج شده که یک گروه یا یک متغیر ایجاد نشود و در عملکرد کد تاثیری ندارد

    • امیرمسعود ایرانی می‌گوید:

      با سلام
      علامت /u اصطلاحات یک modifier است که احتمالا در php با آن مواجه شده باشید
      این علامت مشخص می‌کند که سیستم عملکرد regex روی حروف یونیکد و نه ascii فعال شود
      به دلیل اینکه php به صورت معمول روی حروف ascii کار می‌کند، لازم بوده است تا یک تنظیم به این شکل به آن اضافه شود

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *