RegEx چیست؟ – عبارت های با قاعده به زبان ساده – فرادرس

RegEx چیست؟ – عبارت های با قاعده به زبان ساده – فرادرس


«عبارات منظم» یا «عبارات با قاعده» (Regular Expressions) برای گستره وسیعی از وظایف مربوط به پردازش رشته، از اعتبارسنجی داده‌ها گرفته تا جست‌وجوی سریع برای پیدا کردن عبارت‌ها در متن‌های طولانی، استفاده می‌شوند. به‌کمک درک رجکس‌ها می‌توانید برای پیدا کردن دقیق رشته‌ای که می‌خواهید ابزار قدرتمندی بسازید. سعی کرده‌ایم در این مطلب از مجله فرادرس به این سوال که RegEx چیست پاسخ کاملی بدهیم و روش استفاده از آن را بیان کنیم.

عبارات منظم ابزار قدرتمندی هستند که می‌توانند برای جستجو، دستکاری و اعتبارسنجی رشته‌ها استفاده شوند. با اینکه در ابتدا ممکن است کمی پیچیده به نظر برسند اما داشتن درک خوب درباره مفاهیم و اجزای عبارات منظم، برای هر برنامه‌نویسی امری ضروری است و با کمی تکرار و تمرین متوجه خواهید شد که نه‌تنها چندان سخت نیست بلکه جذابیت خاصی هم دارد.

RegEx چیست؟

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

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

عبارات منظم با استفاده ترکیبی از کاراکترهای اختصاصی‌سازی شده و کاراکترهای عینی نوشته می‌شوند.

  • کاراکترهای اختصاصی‌سازی شده اجازه می‌دهند که از RegEx برای پیداکردن الگو در رشته‌ها استفاده شود، در واقع کاراکترهای اختصاصی‌سازی شده، به کاراکترهایی می‌گویند که دارای معنی و وظیفه خاصی هستند و به معنی ظاهری‌شان استفاده نمی‌شوند. به عنوان مثال کاراکتر *

     به معنی نماد ستاره نیست و وظیفه و شرایط خاصی را برای رشته ماقبل خود تعیین می‌کند که در ادامه به‌طور کامل توضیح داده‌ایم.

  • کارکترهای عینی برای تطابق دقیق معنا با هر کاراکتر یا عبارت استفاده می‌شود. در واقع به کاراکتر یا نمادی که نشانه خودش است، به‌جای خودش قرار می‌گیرد و سمبل آن همان نمایش مقدار خودش است، «ثابت عینی» (Literal) می‌گویند.

برای مثال در صورتی که بخواهید هر رشته‌ای را که با «ABC» شروع می‌شود و به «xyz» ختم می‌شود را با عبارات منظم تطابق دهید، می‌توانید از RegEx زیر استفاده کنید.

/^ABC.*xyz$/

این RegEx با هر رشته‌ای که با «ABC» شروع شود و با هر تعداد کاراکتر دلخواه ادامه داشته باشد قبل از اینکه به «xyz» ختم شود تطابق‌پذیری دارد. عبارات منظم برای گستره وسیعی از وظایف از اعتبارسنجی داده‌ها گرفته تا جست‌وجو سریع روی حجم زیادی از متن قابل استفاده است و برای هر برنامه‌نویس یا دانشمند داده‌ای که با رشته‌ها یا داده‌های مبتنی بر متن کار می‌کند، ابزار بسیار ضروری است.

اجزای RegEx چیست؟

RegEx-ها از چندین جزء مختلف تشکیل شده‌اند که برای تعریف یک الگوی جست‌وجو با یکدیگر کار می‌کنند. رایج‌ترین اجزا شامل «اَنکرها» (Anchors)، کلاس‌های کاراکتر، «شمارنده‌ها» (Quantifiers) و «جایگزینی» (Alternation) هستند.

Anchors

«اَنکرها» (Anchors) نقاط شروع و پایان یک خط یا رشته را به یکدیگر تطبیق می‌دهند. برای مثال، می‌توانید از ^

  برای علامت گذاری محل شروع یک رشته و از « $ » برای علامت گذاری پایان یک رشته استفاده کنید.

کلاس های کاراکتر

«کلاس‌های کاراکتری» (Character Classes) این امکان را می‌دهند، مجموعه‌های خاصی از کاراکترها را تعریف کنید که می‌توانند در الگویی برای جست‌وجو استفاده شوند. برای مثال، می‌توان از d

  برای تطبیق هر رقمی از ۰ تا ۹ یا از w

  برای تطبیق هر کاراکتر «عددی-الفبایی» (Alphanumeric) استفاده کنید.

شمارنده ها

«شمارنده‌ها» (Quantifiers) این امکان را می‌دهند تا مشخص کنید چه تعدادی از کاراکترها یا کلاس‌های کاراکتری باید تطبیق داده‌شوند. برای مثال، می‌توان با استفاده از « * » معین کرد که تعداد صفر یا بیشتری از کاراکتر یا کلاس کاراکتری قبلی به‌کار برده شود یا از « + » استفاده کنید تا تعداد حداقل یک یا بیشتری از کاراکتر یا کلاس کاراکتری قبلی استفاده شود.

جایگزینی

«جایگزینی» (Alternation) این امکان را می‌دهد که چندین الگوی جست‌وجوی قابل تطبیق را مشخص کنید که برای هرکدام احتمال وقوع وجود دارد. برای مثال، با استفاده از |

  می‌توانید هرکدام از دو کلاس کاراکتری یا کاراکترها را که در دو طرف علامت قرار گرفته‌اند، استفاده کنید.

این اجزا، تنها تعدادی از اجزایی هستند که برای ساخت عبارات منظم استفاده می‌شوند. آگاهی از نحوه استفاده صحیح از این اجزا برای ایجاد RegEx‌-های قدرتمند و یافتن رشته‌های خاصی درون متن، ضروری است.

مفاهیم پایه RegEx

برای اینکه بفهمیم RegEx چیست، درک مفاهیم پایه RegEx ضروری است. مهم‌ترین مفاهیم این بخش را در زیر فهرست کرده‌ایم و برای هر یک توضیح مختصری آورده‌ایم.

  • «نمادگذاری» (Notation): عبارت مختصری که برای اشاره به الگوهای رایج، استفاده می‌شود.
  • «قواعد دستوری» (Syntax): مجموعه قوانینی که چگونگی نوشتن RegEx‌-ها را تعیین می‌کنند.
  • «الگوها» (Patterns): ردیفی از کاراکترها که یک الگوی جست‌وجو را تعریف می‌کنند.
  • «تطبیق» (Matching): فرایند پیداکردن الگوی خاصی درون رشته‌ها (همه کارها درنهایت برای این است که بتوانیم الگوی RegEx طراحی کنیم که به کمک تطبیق آن بر روی رشته، کلمه‌، متن یا عبارتی که به‌دنبال آن می‌گردیم به هدف خود برسیم).
  • «ذخیره‌سازی» (Capturing): به فرایند ذخیره‌کردن همه یا قسمتی از یک رشته تطبیق داده شده، به‌صورت یک گروه برای استفاده در آینده گفته می‌شود.
  • «جای‌گذاری» (Substitution): به فرایند جای‌گذاری الگوی تطبیق داده شده با رشته دیگری، Substitution می‌گویند.
  • «پرچم‌ها» (Flags): مجموعه دستورالعمل‌هایی که رفتار RegEx را بهبود می‌بخشند.

در ادامه مطلب برای همه مفاهیم تعریف شده در بالا، توضیح بیشتر به همراه مثال برای درک بهتر موضوع، آورده‌ایم.

قواعد دستوری و نماد گذاری

اکنون که تقریبا متوجه شدیم RegEx چیست باید با مفاهیم RegEx نیز بیشتر آشنا شویم. قبل از اینکه RegEx نویسی را شروع کنیم، بسیار مهم است که خود را با استفاده از قواعد دستوری و نمادگذاری خو بدهیم. رایج‌ترین عناصر قواعد دستوری شامل مواردی می‌شوند که در ادامه فهرست کرده‌ایم.

  • «بک‌اسلش» (Backslash) با علامت

     : کاراکترهای اختصاصی را رها می‌کند تا بتوانند به‌عنوان کاراکتر عینی به‌کار برده شوند.

  • «براکت» (Brackets) با علامت ( )

     : مجموعه‌ای از کاراکترها را که باید تطبیق داده شوند تعریف می‌کند و از کاراکترهای احتمالی اطرافشان مجزا می‌کند.

  • «پرانتز» (Parentheses) با علامت ( )

     : قسمتی از تطبیقی را در یک گروه ذخیره می‌کند.

  • «ستاره» (Asterisk) با علامت *

    : بررسی می‌کند که تعداد صفر یا بیشتری از کاراکتر یا کلاس کاراکتری قبلی تطبیق داده شوند.

  • «علامت جمع» (Plus sign) با علامت +

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

  • «علامت سوال» (Question mark) با علامت ?

     : بررسی می‌کند که تعداد فقط صفر یا یک عدد از کاراکتر یا کلاس کاراکتری قبلی تطبیق داده شوند.

  • «پایپ» (Pipe) با علامت |

    : برای تطبیق هر یک از دو مورد کاراکتر یا کلاس کاراکتری موجود در دو طرف پایپ، به‌کار برده می‌شود.

رایج‌ترین عناصر نمادگذاری، در فهرست زیر آورده شده است.

  • ^

     : شروع رشته یا خطی را که قرار است تطبیق داده شود مشخص می‌کند.

  • $

     : پایان رشته یا خطی را که قرار است تطبیق داده شود مشخص می‌کند.

  • d

     : تمام رقم‌ها از ۰ تا ۹ را تطبیق می‌دهد.

  • w

     : تمام کاراکترهای الفبا و رقمی را تطبیق می‌دهد. فقط الفبای انگلیسی و رقم (a-zA-Z0-9) را بررسی می‌کند.

سعی کنید این قواعد دستوری و نمادگذاری‌ها را یاد بگیرید. این مهارت‌ها در ایجاد RegEx‌-های قوی‌تر کمک زیادی به شما خواهد کرد.

الگوها

RegEx‌-ها از «الگوهایی» (Patterns) تشکیل شده‌اند که خود، الگوی جست‌وجو تعریف می‌کنند. برای اینکه بدانید ابتدایی‌ترین RegEx چیست، باید بگوییم که ابتدایی‌ترین RegEx به سادگی از توالی از کاراکترها تشکیل می‌شود. برای مثال، رشته «cat» با هر توالی موجودی از حرف «c» که با حرف «a»ی دنبال شود که خود با حرف «t» دنبال می‌شود در هر رشته، مطابقت پیدا می‌کند.

به همین صورت برای ایجاد RegEx-های پیچیده‌تر می‌توانید از کاراکترهای خاص یا کلاس‌های کاراکتری استفاده کنید. برای مثال، رشته dw+

 با هر توالی از به تعداد یک یا بیشتر کاراکتر «حرفی-عددی» (Alphanumeric) در رنج (a-zA-Z0-9) مطابقت پیدا می‌کند.

شما همچنین می‌توانید چندین الگو را با یکدیگر ترکیب کنید تا RegEx-های پیچیده‌تری ایجاد کنید. به‌عنوان نمونه، رشته ^d{2}-w+

 با هر توالی از کاراکترها به این صورت که در ابتدا دو رقم وجود داشته باشند که با یک خط تیره دنبال شوند که آن هم با تعداد حداقل یک کاراکتر حرف-عددی دنبال شود.

تطبیق

دفعه اولی که RegEx خود را ایجاد کردید یا الگوی جست‌وجوی خود را تعریف کردید، می‌توانید از آن برای «تطبیق» (Matching) با رشته متناظرش در هر متنی استفاده کنید. هرچه قدر بیشتر به‌پیش بروید و تمرین کنید، بیشتر متوجه خواهید شد که RegEx چیست و چگونه می‌توان از آن استفاده برد. ابزار و زبان‌های برنامه‌نویسی زیادی وجود دارند که امکان استفاده از RegEx را می‌دهند. بعضی از این زبان‌های برنامه نویسی را برای شما فهرست کرده‌ایم.

Capturing

علاوه‌بر تطبیق رشته‌ها با متن، RegEx-ها همچنین توانایی ذخیره‌کردن قسمتی یا تمام یک تطبیق را درون یک گروه دارند. اگر به‌خواهید برای استفاده در آینده، قسمتی از متن مطابقت یافته خاصی را ذخیره کنید، این توانایی بسیار مفید است. برای مثال در RegEx ^d{2}-w+

  می‌توان ۲ رقم اول و بقیه کاراکترهای حرفی-عددی را -بعد از شناسایی تمام مطابقت‌ها در متن مورد نظر- در گروه‌های جداگانه‌ای ذخیره کرد. به این کار «ذخیره‌سازی» (Capturing) می‌گویند. واژه ذخیره‌سازی تا حد خوبی، رفتار این عملیات را توصیف می‌کند.

جای گذاری

یکی از کاربردهای دیگر RegEx «جای‌گذاری» (Substitution) است. یعنی از RegEx زمانی که می‌خواهید الگوی تطبیق یافته‌ای را به‌جای رشته‌ی دیگری جای‌گذاری کنید نیز استفاده می‌شود. این کاربرد درجایی مفید است که بخواهید بخش‌های مشخصی از یک متن را با رشته دیگری جایگزین کنید.

برای مثال، RegEx ^d{2}-w+

 می‌تواند برای جای‌گذاری ۲ کاراکتر عددی اول یا بقیه کاراکترهای حرفی-عددی با رشته جدیدی استفاده شود.

پرچم‌ ها

و درنهایت برای اینکه بیشتر متوجه شوید RegEx چیست باید نسبت به «پرچم‌ها» (Flags)هم اطلاعات اولیه‌ای داشته باشید. RegEx-ها می‌توانند از پرچم‌ها برای بهبود رفتار خودشان استفاده کنند. این پرچم‌ها اجازه می‌دهند که چگونگی رفتار RegEx را تغییر دهید، به عنوان مثال می‌توانید تعیین کنید که RegEx نسبت به بزرگی و کوچکی حروف بی تفاوت باشد یا اجازه بدهید که عمل تطبیق را روی چندین خط انجام دهد.

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

RegEx‌-ها به‌طور باورنکردنی در کار تغییردادن و جست‌وجو روی رشته‌های هر متنی قدرتمند عمل می‌کنند. به وسیله چند جز ساده و ابتدایی از الگوها، قواعد دستوری و نمادگذاری‌ها می‌توانید RegEx-های قدرتمندی درست کنید که برای تطبیق دادن، ذخیره‌سازی و جای‌گذاری تکه‌های رشته‌ها استفاده شوند.

نحوه ایجاد RegEX برای یافتن مطابقت ها در رشته

تا اینجا درک مناسبی پیدا کرده‌ایم که RefEx چیست و چه کاربردهایی دارد اما در ادامه می‌خواهیم با حل مثال‌هایی، اولین RegEx را ایجاد کنیم.

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

مرحله اول

در زمان حل مسئله، برای فکر کردن روی الگو زمان کافی صرف کنید و مسئله را برای درک بهتر شرایط تجزیه کنید. این رفتار کمک خواهد کرد RegEx بسیار شخصی‌سازی شده‌تر و دقیق‌تری ایجاد کنید و بخاطر کم‌بود برنامه‌ریزی، زمان را برای آزمون و خطا از دست ندهید.

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

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

این دانسته‌های ساده نیازمندی‌های ذخیره‌سازی شما را فراهم می‌کند اما باید مولفه‌های دیگری را نیز در نظر بگیرید. در فهرست زیر چند مورد را برای مثال آورده‌ایم.

  • آیا رشته‌های با حروف الفبای بزرگ و کوچک را هم تطبیق خواهید داد؟
  • آیا علائم نگارشی یا نمادها روی خروجی موثراند؟
  • در مقابل رشته‌های شامل چند نمونه از واژه «Cat» باید چه رویکردی در نظر بگیریم؟(برای مثال «Cats have cats»).
  • آیا رشته‌های شامل واژه «cat» را که کلماتی قبل یا بعد از آن دارند را نیز مطابقت خواهید داد؟

این پارامترها کمک خواهند کرد که الگوی جست‌وجوی RegEx خود را تعیین کنید. تجزیه کردن جزییات نیازمندی‌های الگوی شما قبل از نوشتن کد به شما کمک خواهد کرد RegEx-های بهتری را در زمان سریع‌تری بنویسید. زمانی که الگوی شما تعیین شد، می‌توانید به مرحله دوم وارد شوید و RegEx خود را بسازید.

مرحله دوم

الان که می‌دانید به‌دنبال چه نوع رشته‌ای می‌گردید، زمان ساختن RegEx است که به‌تواند به‌دنبال آن رشته بگردد. جست‌وجوی را ادامه دهیم تا همه رشته‌های شامل کلمه «cat» را تطبیق دهیم. RegEx به این شکل خواهد بود.

w+catw+

این RegEx با هر توالی از کاراکترها که شامل کلمه «cat» شوند، مطابقت خواهد داشت. از طرف دیگر، این RegEx که در زیر نشان داده‌ایم، نتایج اشتباه زیادی برمی‌گرداند.

bc?a?tb

این RegEx با هر رشته‌ایی که شامل حروف «c» ,«a», و «t» باشد، مطابقت دارد. اما نکته اینجاست که ترتیب قرارگیری این حروف اهمیتی ندارد پس الزاما رشته‌ها نباید شامل توالی «cat» باشند و بطور مثال اگر رشته‌ای شامل توالی «tac» هم باشد با این RegEx مطابقت خواهد داشت، همچنین با رشته‌هایی بدون این حروف هم مطابقت خواهد کرد. می‌بینید که کارکردن صحیح با RegEx-ها بدون تمرین، بسیار مشکل است.

bc?atb

این RegEx مشخص‌تر است و به‌صورت دقیق، فقط با رشته «cat» مطابقت دارد.

به برنامه می‌گوید به دنبال کلمه «cat» بگردد، چه در اول رشته‌ای باشد (به‌وسیله ترکیب کاراکتری b

  به این مطلب اشاره شده) یا در وسط رشته و اینکه هر علامت نگارشی یا کاراکتر دیگری را که ممکن است وجود داشته باشد، نادیده به‌گیرد(به‌وسیله کاراکتر ?

  به این مطلب اشاره شده).

علامت b

  برای نشان دادن حدود رشته به‌کار می‌رود و علامت سوال بعد از حرف «c»، آن را اختیاری می‌کند. به این معنا که RegEx با هردو شکل کلمه یعنی «cat» و «Cat» مطابقت خواهد کرد اما با دیگر رشته‌ها مطابقت نخواهد یافت. زمانی که درحال ایجاد رشته جست‌وجوی RegEx هستید، پارامترهایی مانند «حساسیت بزرگی و کوچکی حروف» (Case Sensitivity) و مطابقت‌های چندگانه را در نظر خواهید گرفت.

حساسیت به بزرگی و کوچکی حروف

اگر می‌خواهید که جست‌وجوی شما نسبت به بزرگی و کوچکی حروف حساس نباشد، می‌توانید پرچم i

 را به انتهای RegEx خود اضافه کنید.

/w+catw+/i

علامت /

 به شروع و پایان رشته اشاره می‌کند، درحالی که علامت i

 در آخر رشته یک پرچم اختیاری است که جست‌وجوی شما را نسبت به بزرگی و کوچکی حروف بی‌تفاوت می‌کند پس RegEx شما با هردو حالت،حروف بزرگ و کوچک مطابقت خواهد داشت.

چندین نمونه در یک رشته

اگر می‌خواهید به دنبال چندین نمونه از الگویی در یک رشته باشید، می‌توانید از علامت ستاره استفاده کنید (به عنوان «نویسه جایگزین» (wildcard) برای تطابق با هرتعداد کاراکتر موجود). برای نمونه، اگر می‌خواهید الگوی RegExتان، با رشته‌هایی که چندین مورد واژه «cat» در آن‌ها وجود دارد تطبیق پیدا کند، می‌توانید از RegEx که در ادامه آمده است استفاده کنید.

w+catw*catw+

این RegEx با رشته‌هایی مانند «Cats have cats» نیز مطابقت خواهد کرد. همچنین می‌توانید از علامت به‌علاوه +

 استفاده کنید. این علامت به این معنی است که حداقل یک نمونه‌ یا تعداد بیشتری از کاراکترهایی که مشخص شده‌اند باید وجود داشته باشند تا رشته مورد نظر با RegEx مطابقت داشته باشد. برای مثال، این RegEx با رشته‌ای مانند «catty» مطابقت خواهد داشت اما با رشته «cat» به تنهایی تطبیق پیدا نخواهد کرد.

w+cat+yw+

تطبیق الگوی دقیق

اگر می‌خواهید که دقیقا به‌دنبال الگوی خاصی بگردید، می‌توانید از علامت‌های «هشتک» – نه هشتگ – یا «کارِت» (caret) با نماد ^

 و دلار با نماد $

 استفاده کنید. این علامت‌ها به عنوان «اَنکِر» (Anchor)هایی برای تعیین شروع و پایان رشته‌ها به‌کار می‌روند. برای مثال، RegEx زیر فقط با رشته «cat» مطابقت خواهد داشت.

^cat$

حالا که رشته جستجوی RegEx شما آماده شده، زمان شروع مرحله سوم است، یعنی نوبت آزمایش و تنظیم RegEx شده.

مرحله سوم

وقتی که RegEx رشته جستجوی شما آماده شد، مرحله بعدی آزمایش کردن است. در این مرحله متوجه خواهید شد که آیا RegEx شما با رشته‌هایی که به‌دنبال آن‌ها می‌گردید مطابقت خواهد داشت یا نه. می‌توانید از ابزاری مانند Regex101 و RegExr استفاده کنید تا RegEx‌ خود را به صورت درلحظه آزمایش کنید و مطمئن شوید که آیا با داده‌های صحیح به‌طور کامل مطابقت خواهد داشت.

آزمودن RegEx کمک می‌کند که قبل از نوشتن کدها، هر خطا یا مشکلی را در الگوی خود تشخیص دهید، که باعث می‌شود در بلند مدت در زمان و انرژی شما صرفه‌جویی قابل توجهی شود. اگر متوجه شدید که RegEx شما، آن‌طور که مورد انتظار است کار نمی‌کند، از اصلاح کردن یا انجام تغییرات کوچک در آن نترسید. عبارات منظم را به روش‌های مختلفی می‌توان نوشت، پیداکردن موردی که روی گزینه مورد نظر شما به خوبی کار کند، اغلب اوقات با آزمون و خطا ممکن می‌شود.

حالا که RegEx خود را آزمودید و آنقدر دستکاری اش کردید تا با هدفی که به دنبال آن بودید تطابق داشته باشد، می‌توانید به مرحله چهارم بروید. از RegEx در کدهایتان استفاده کنید.

مرحله چهارم

در این مرحله که RegEx شما طراحی، ایجاد و آزمایش شده، به نظر می‌آید از سوال RegEx چیست عبور کرده و به سوال چطور از RegEx استفاده می‌شود، رسیده‌اید. مرحله بعدی استفاده از RegEx حاصل زحماتتان در میان کدها است. بسته به زبان برنامه‌نویسی که استفاده می‌کنید، روش‌های مختلفی برای پیاده‌سازی جست‌وجو با رجکس وجود دارد. به عنوان مثال، در زبان برنامه‌نویسی «جاوا اسکریپت» (JavaScript) از متد String.prototype.match()

  استفاده خواهید کرد.

let str = ‘cat’
let regexp = /w+catw+/i;
console.log(str.match(regexp)); // Output: ("cat")

در زبان برنامه‌نویسی پایتون از تابع re.search()

 استفاده خواهید کرد. این تابع داخل کتابخانه re تعریف شده که در صورت نیاز باید نصب شود.

import re
string = ‘cat’
regexp = r’w+catw+’
result = re.search(regexp, string)
print(result.group()) # Output: cat

به‌طور خلاصه، در هر قسمتی از کد که تطابق الگو نیاز دارید، به این روش‌ها می‌توانید از RegEx خود استفاده کنید. بیشتر زبان‌های برنامه‌نویسی و ابزارها مانند پایتون، جاوا اسکریپت، پی اچ پی، جاوا و غیره از RegEx-ها پشتیبانی می‌کنند. استفاده از RegEx روش قدرتمندی برای حل مسائلی است که مربوط به تجزیه و تحلیل متن‌ها می‌شوند یا برای مسائلی مانند جستوجوی رشته‌‌ای خاص یا جایگذاری رشته‌ها نیز بسیار پُر استفاده است.

تمرین دوم Regex تطبیق دادن رشته ها با قالب آدرس ایمیل

حالا که روش استفاده از عبارات منظم را برای تطبیق رشته‌ها آموخته‌اید، باید بیشتر بیاموزیم و تمرین کنیم. پس تلاش می‌کنیم تا بفهمیم، روش تطبیق شکل آدرس ایمیل با RegEx چیست؟

هدف اینجا، نوشتن عبارت منظمی است که با شکل معتبر آدرس ایمیل مطابقت داشته باشد. فرض کنید، می‌خواهید تمام رشته‌هایی که شامل آدرس ایمیل باشند را ذخیره‌کنید. برای اینکه این هدف را به شکل RegEx بنویسیم، توالی کاراکتری شبیه مورد زیرین خواهیم داشت.

w+@w+.w{3}

RegEx بالا، با رشته‌هایی تطابق پیدا خواهد کرد که در ابتدا شامل نام کاربری باشند که با علامت @

 دنبال می‌شوند و سپس یک نام دامنه می‌آید، و بعد از آن نام دامنه‌ای سطح بالا خواهد آمد (مانند .net

  یا .com

 ).

در ابتدا «نمادگذاری» (Notation) را که باعث بدست آمدن این نتیجه شد را باید بررسی کنیم.

  • نماد w+

     با هر توالی از هر تعداد کاراکتر، شامل حروف الفبا، اعداد و «خط زیر» (Underscore) مطابقت دارد. این نماد کمک می‌کند تا قسمت نام‌کاربری آدرس ایمیل را «ذخیره‌کنیم» (Capture).

  • بعد از آن نماد @

     می‌آید که با نماد

    رها شده تا فقط نمایش شکل خودش باشد. به این دلیل که نماد @

     معنی خاصی در RegEx دارد و باید رها شود تا با کارکتر عینی خودش تطابق داشته باشد، از

     استفاده شده.

  • در ادامه نمادها بار دیگر w+

     قرارداده شده، که محدوده نام دامنه آدرس ایمیل را نشان می‌دهد.

  • در نهایت در آخرین حلقه این زنجیره عبارت w{3}

    قراردارد که مشخص می‌کند، فقط ۳ کاراتر برای انتهای آدرس ایمیل لازم داریم که دقیقا شکل «دامنه سطح بالا» (Top-Level Domain | TLD) به این صورت است.

تصور کنیم که چگونه می‌توان این الگو را با درنظر گرفتن موقعیت‌های غیرعادی و نمونه‌های خاص بهبود ببخشیم و توانایی آن را برای انتخاب دقیق آدرس ایمیل معتبر افزایش دهیم. در ادامه مثال‌هایی از نمونه‌هایی که می‌خواهیم RegEx ما با آن‌ها تطابق داشته باشد آورده‌ایم.

example1@domain.com
example2-something@domain.co
example3_here+there@domain.org

و در این بلوک نمونه‌هایی از رشته‌هایی که نباید با RegEx مطابق باشند آورده‌ایم.

notvalid.com
another example@@domain.net
not valid again!%$#$

در مثال‌های بالا، نام‌های کاربری و دامنه‌هایی دیده می‌شوند که می‌توانند شامل کاراکترهای خاص مانند خط تیره

 ، خط زیر ـ

 و علامت به‌علاوه +

 . برای اینکه بتوانیم این اشکال خاص را نیز به عنوان آدرس ایمیل معتبر به حساب بیاوریم، نیازداریم که در الگوی RegEx خود کمی تغییرات اضافه کنیم.

برای اینکه مشخص کنیم چه رشته‌هایی باید مطابقت داده شوند، باید یک سری کاراکتر اضافه به الگوی RegEx خود اضافه کنیم تا RegExمان دقیق‌تر شود و مثال‌های خاصی را بتوانیم، ذخیره کنیم. این‌بار الگوی RegEx شبیه مورد زیر می‌شود.

w+((.-)?w+)*@w+((.-)?w+)*(.w{2,3})+

برای اینکه درک کنید که این الگوی RegEx چیست به ادامه متن دقت کنید. کاراکتر‌های اضافی که به این متن افزوده شده‌اند ((.-)?w+)*

 این امکان را می‌دهند تا کاراکترهای ویژه مشخصی را مطابقت دهیم و از خط تیره در قسمت نام کاربری و دامنه آدرس ایمیل استفاده کنیم. ما همچنین توالی کاراکتری w{2,3}

 را اضافه کردیم، که مشخص می‌کند که «دامنه سطح بالا» (Top-Level Domain | TLD) باید ۲ یا ۳ کاراکتر طول داشته باشد.

اکنون، وقتی که شما این RegEx را در مقابل نمونه‌های داده شده در بالا آزمایش کنید، با تمام آدرس‌های ایمیل معتبر مطابقت خواهد داشت و تمام ایمیل‌های نامعتبر را رد می‌کند. در ادامه الگو را تجزیه کرده و توضیحات بیشتری داده‌ایم.

  • w+

     با توالی از کاراکترها مطابقت دارد (شامل حروف، اعداد و خط تیره می‌شود) و حداقل باید یک کاراکتر طول داشته باشد.

  • ((.-)?w+)*

     به RegEx اجازه می‌دهد در قسمت نام کاربری ایمیل با هر کاراکتر ویژه‌ای یا خط تیره تطبیق پیدا کند.

  • w+

     با هر توالی از کاراکترها که حداقل یک کارکتر طول داشته باشد مطابقت دارد.

  • ((.-)?w+)*

     به RegEx اجازه می‌دهد در قسمت نام دامنه ایمیل با هر کاراکتر ویژه‌ای یا خط تیره تطبیق پیدا کند.

  • (.w{2,3})+

     مشخص می‌کند که «دامنه سطح بالا» (TLD) باید بین ۲ یا ۳ کاراکتر طول داشته باشد.

با این الگو می‌توان با دقت رشته‌های ورودی را با شکل معتبر آدرس‌های ایمیل تطبیق داد و رشته‌هایی در اشکال دیگر را رد کرد. با اصلاح کردن عبارت منظم برای تطبیق با اشکال بیشتری از آدرس‌های معتبر ایمیل‌، می‌توان مطمئن شد که RegEx ما در تجزیه و تحلیل رشته‌ها بسیار دقیق‌تر عملکرده و نتایج موثق‌تری را ارائه می‌دهد.

علت استفاده از شمارنده‌ ها در RegEx چیست؟

یکی از پرکاربرد‌ترین ابزار RegEx-ها امکان استفاده از «شمارنده‌ها» (Quantifiers) است. شمارنده‌ها به این اشاره می‌کنند که چندبار یک کاراکتر، گروه یا الگو باید در رشته‌ای تطبیق داده شوند تا آن رشته معتبر باشد. برای اینکه بهتر متوجه شوید روش کار شمارنده‌ها در RegEx چیست باید مثالی بزنیم. برای نمونه، اگر بخواهید RegEx شما با هر عددی از ۰ تا ۹۹ مطابقت داشته باشد می‌توانید از الگوی RegEx زیر استفاده کنید.

d{1,2}

این رجکس با هر عدد یک رقمی یا دو رقمی تطبیق دارد، که برای پیدا کردن رشته‌هایی که با خواسته شما مطابقت داشته باشند کار را بسیار ساده‌ می‌کند. برای استفاده از RegEx-ها چندین نوع مختلف از شمارنده‌ها وجود دارند که در ادامه به آن‌ها اشاره می‌کنیم.

علامت سوال (؟)

کاراکتر یا کلاس کاراکتری که قبل از علامت سوال قرار دارد بین ۰ یا ۱ بار می‌تواند وجود داشته باشد.

d?

علامت ستاره (*)

کاراکتر یا کلاس کاراکتری که قبل از علامت ستاره قرار دارد بین ۰ یا بیشتر می‌تواند وجود داشته باشد.

d*

علامت به‌اضافه (+)

کاراکتر یا کلاس کاراکتری که قبل از علامت به‌اضافه، قرار دارد بین ۱ یا بیشتر می‌تواند وجود داشته باشد (حداقل یکبار باید وجود داشته باشد).

d+

علامت آکولاد ({m,n})

کاراکتر یا کلاس کاراکتری که قبل از علامت آکولاد {m,n}

 قرار دارد از m تا n بار می‌تواند وجود داشته باشد (حداقل m بار و حداکثر n بار باید وجود داشته باشد). توجه کنید اگر در آکولاد فقط ۱ عدد بود یعنی دقیقا به مقدار عدد باید وجود داشته باشد، نه بیشتر و نه کمتر.

d{2,4}

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

استفاده از نگاه رو به جلو و نگاه به عقب

«نگاه به‌جلو» (Lookahead) و «نگاه به‌عقب» (Lookbehind) ابزار قدرتمند دیگری هستند که برای استفاده در RegEx-ها در دسترس‌اند. این ابزار کمک می‌کنند که قبل یا بعد از اصطلاح اصلی را برای یافتن الگوی مشخصی بررسی کنید بدون اینکه آن اصطلاح را درون الگوی تطبیق خود وارد کنید. برای اینکه بهتر متوجه شویم که کاربرد و روش کار این ابزار در RegEx چیست باید مثالی بزنیم. به‌عنوان نمونه، اگر بدنبال یافتن همه کلمات مطابق کلمه «apple» باشید به این شرط که این کلمه قبل از عبارت «is tasty» آمده باشد، می‌توانید از RegEx زیر استفاده کنید.

(?<=apple)sisstasty

در این الگوی RegEx، علامت نگاه به عقب به همراه کلمه مورد نظر (?&lt=apple)

 به‌دنبال «apple»هایی می‌گردد که قبل از عبارت «is tasty» آمده باشند و سپس با آن‌ها تطبیق داده می‌شود. این ابزار تطبیق الگوها را با رشته‌ها باتوجه به مفهوم آن‌ها بسیار ساده‌تر می‌کند.

نگاه به جلوهم مانند نگاه به عقب کار می‌کند، با این تفاوت که این ابزار به دنبال الگوی مشخصی بعد از عبارت اصلی می‌گردد، نه قبل از آن. برای نمونه، اگر بدنبال یافتن همه کلمات مطابق عبارت «is tasty» باشید به این شرط که این کلمه بعد از کلمه «apple» آمده باشد، می‌توانید از RegEx زیر استفاده کنید.

apples(?=isstasty)

در این الگوی RegEx، علامت نگاه روبه‌جلو با عبارت مربوطه آن (?=isstasty)

 به دنبال عبارت «is tasty»هایی می‌گردد که بعد از کلمه «apple» آمده باشند و سپس با آن‌ها تطبیق داده می‌شود. این ابزار روش قدرتمندی برای تطبیق الگوها بر پایه مفهوم آن‌ها است.

بیان عینی یک رشته

RegEx توانایی انطباق عینی الگو با رشته‌ها را نیز دارد. بیان عینی رشته‌ها به‌این معنا است که به‌جای استفاده به‌عنوان کاراکترهای خاص یا قواعد نوشتاری RegEx، با رشته‌ دقیقا به‌عنوان الگوی انطباق رفتار می‌کنید. برای مثال، اگر بخواهیم دقیقا عبارت «apple is tasty» را انطباق بدهیم، می‌توانیم از RegEx زیر استفاده کنیم.

Qapple is tastyE

برای درک اینکه معنای این مطلب در RegEx چیست لطفا توجه کنید. کاراکترهای Q

  و E

  به RegEx می‌گویند که عبارت «apple is tasty» را به‌طور دقیق و واژه به واژه بیان کن، بدون کم کردن یا اضافه کردن چیزی، درنتیجه اگر داخل RegEx هر نوع کاراکتر خاص یا قواعد دستوری با معنای مشخصی وجود داشته باشد، تفسیر نخواهد شد و به صورت یک عبارت عینی در نظر گرفته خواهد شد. رشته‌ای که به صورت عینی بیان شده فقط با رشته‌های متناظر خودش مطابقت خواهد داشت. این روش، کار را برای تطابق رشته‌هایی شامل کاراکترهای خاص، بسیار راحت‌تر می‌کند.

استفاده از Anchor ها

«انکرها» (Anchors) کمک می‌کنند که الگویی را در ابتدا یا انتهای رشته‌ تطبیق دهید. به عنوان مثال، اگر به‌خواهیم که الگوی ما با تمام واژه‌هایی تطابق داشته باشد که با حرف «a» شروع می‌شود، از RegEx زیر استفاده می‌کنیم.

^aw+

در این الگوی RegEx، علامت هشتک ^

 انکری است که محل ابتدای رشته را تطبیق می‌دهد. به‌ همین صورت، اگر بخواهیم که الگوی RegEx ما با همه حروفی تطبیق پیدا کند که به واژه‌ی «s» ختم می‌شوند، می‌توانیم از RegEx زیر استفاده کنیم.

w+s$

در این الگوی RegEx، علامت دلار $

 انکری است که محل انتهای رشته را تطبیق می‌دهد.

استفاده از گروه ها و ارجاعات به عقب

«گروه‌ها» (Groups) این امکان را ایجاد می‌کنند که یک الگو را چندین بار درون رشته‌ای تطبیق دهید و «ارجاعات به عقب» (‌BackReferences) به شما این امکان را می‌دهند که به عقب اشاره کنید، درواقع به گروه تطبیق داده‌شده قبلی اشاره کنید.

برای اینکه بیشتر درک کنید که کاربرد این دو روش در RegEx چیست به مثالی که در ادامه می آید توجه کنید. اگر بخواهید که الگوی شما با همه کلماتی که با حرف «a» شروع می‌شوند و با حرف «s» تمام می‌شوند، مطابقت داشته باشد، می‌توانید از RegEx زیر، استفاده کنید.

^(aw+s)$

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

«ارجاعات به عقب» (Backreferences) به ما این امکان را می‌دهند که به عقب اشاره کنیم، به گروه‌هایی که قبلا تطابق داده شده‌اند. با مثالی می‌توان بهتر درک کرد که مفهوم این مطلب در RegEx چیست. اگر بخواهیم که همه کلماتی که با حرف «a» شروع می‌شوند و با حرف «s» تمام می‌شوند، با الگوی ما مطابقت داشته باشند، اما در عین‌حال کاراکتر میانی همسان داشته باشند، می‌توانیم از RegEx زیر استفاده کنیم.

^(aw+s)1$

متوجه شدید که این مفهوم در RegEx چیست، در الگوی RegEx بالا، علامت ارجاع به عقب 1

 به اولین گروه در عقب، اشاره می‌کند. با حرف «a» شروع شده، به دنبال آن حداقل یک کاراکتر یا بیشتر باید بیاید و در آخر، دوباره به حرف «s» ختم شود. این روش خوبی برای تطابق الگوهایی است که چندین قسمت مختلف دارند و نیاز دارند که یکسان باشند.

تطبیق ارقام با کلاس های کاراکتری

کلاس‌های کاراکتری این امکان را می‌دهند که هر کاراکتری از یک مجموعه‌ی از پیش تعریف شده‌ از کاراکترها را تطبیق بدهیم. به عنوان مثال، می‌توان برای تطبیق هر رقمی را از ۰ تا ۹، از RegEx زیر استفاده کرد.

d

به‌سادگی قابل درک است که مفهوم این RegEx چیست. در این الگوی RegEx، کاراکتر کلاسی d

 با هر رقمی از ۰ تا ۹ مطابقت دارد. این روش بسیار ساده‌ای برای تطبیق ارقام در رشته‌ها است.

انواع دیگری از کاراکتر های کلاسی

برای استفاده در RegEx، کاراکترهای کلاسی زیادی در دسترس وجود دارند. برای مثال، اگر بخواهیم که شکل کوچک حروف الفبا را تطبیق دهیم (a – z)، می‌توان از RegEx زیر استفاده کرد.

l

در این الگوی RegEx، کلاس کاراکتری l

 با هر شکل کوچکی از حروف الفبا از a تا z تطبیق پیدا می‌کند. به همین شکل، اگر بخواهیم که شکل بزرگ حروف الفبا را تطبیق دهیم (A – Z)، می‌توان از RegEx زیر استفاده کرد.

u

در این الگوی RegEx، کلاس کاراکتری u

 با هر شکل بزرگی از حروف الفبا از A تا Z تطبیق پیدا می‌کند. کلاس‌های کاراکتری روش پرکاربرد و قدرتمندی برای تطبیق الگوها با رشته‌ها هستند.

استفاده از Modifier ها

«تغییردهنده‌ها» (Modifiers) ابزار در دسترس و قدرتمند دیگری‌اند که RegEx از آن‌ها استفاده می‌کند. تغییردهنده‌ها به ما امکان تغییر رفتار عبارات منظم را می‌دهند. برای نمونه، اگر بخواهیم الگوی ما بدون توجه به کوچکی و بزرگی حروف، با همه کلماتی که با حرف «a» شروع می‌شوند و با حرف «s» تمام می‌شوند، تطبیق داشته باشد، می‌توانیم از RegEx آمده در پایین، استفاده کنیم.

(?i)^(aw+s)$

در این الگوی RegEx، تغییر دهنده (?i)

 وضعیت بزرگی و کوچکی حروف را نادیده می‌گیرد (با حرف «A» به خوبی حرف «a» تطبیق پیدا می‌کند). این روش کار را برای تطبیق الگوها با رشته‌ها آسان می‌کند. مخصوصا که در یک رشته جمله یا متن ممکن است حروف یک کلمه در اشکال مختلفی -بزرگ یا کوچک- نوشته شده باشند. تغییردهنده‌های دیگری هم برای استفاده در RegEx وجود دارند، مانند تغییردهنده (?s)

 که امکان انجام عمل تطبیق را در چندین خط از متن ممکن می‌کند.

استفاده از جایگزینی برای ایجاد الگوهای پیچیده

«جایگزینی» (Alternation) این امکان را فراهم می‌کند که یکی از چندین الگوی موجود را تطبیق دهیم. این ابزار به کمک کاراکتر «پایپ» (pipe)، در واقع به این شکل |

 نمایش داده می‌شود. برای اینکه بهتر متوجه شویم که کاربرد و روش کار پایپ در RegEx چیست باید مثالی بزنیم. اگر بخواهیم که در متن یا رشته‌ای کلمات منطبق با «dog» یا «cat» را پیدا کنیم می‌توانیم از RegEx آمده در پایین استفاده کنیم.

cat|dog

در این الگوی RegEx، کاراکتر پایت برای انطباق یکی از دو کلمه «dog» یا «cat» به‌کار رفت. این روش کار را برای انطباق الگوهای پیچیده‌تر با رشته‌ها آسان می‌کند.

همچنین از روش جایگزینی می‌توان در ارتباط با گروه‌ها و کاراکترهای کلاسی نیز استفاده کرد. برای مثال، اگر بخواهیم الگویی بنویسیم که طبق آن RegEx ما در متن مطابقت داشته باشد، با کلمه «cat» یا هر کلمه‌ای که با حرف «d» شروع و با حرف «g» تمام می‌شود، می‌توان از الگوی امده در پایین، استفاده کرد.

cat|^(dw+g)$

در این الگوی RegEx، کاراکتر پایپ برای تطبیق کلمه «cat» یا هر کلمه‌ای که با حرف «d» شروع می‌شود و با حرف «g» تمام می‌شود، به‌کاربرده شده‌است. این روش کار را برای طراحی الگوهای پیچیده‌تر برای انطباق با رشته‌ها آسان می‌کند.

انطباق مثبت و منفی

«انطباق منفی» (Negative Matching) به ما این امکان را می‌دهد که کاراکترهایی را تطبیق دهیم که در رشته‌ی موردنظر حضور ندارند. در واقع عمل انطباق RegEx با رشته‌ها را به شرط عدم حضور کاراکتر خاصی یا عدم وقوع شرایط خاصی انجام می‌گیرد. درحالی که «انطباق مثبت» (Positive Matching) این امکان را می‌دهد که کاراکترهایی را که در رشته‌ها حضور دارند را تطبیق دهیم. برای این‌که بهتر درک کنیم که کاربرد این روش‌ها در RegEx چیست به مثال زیر توجه کنید، اگر نیاز داشته باشیم الگویی را طراحی کنیم که با هر کلمه‌ای مطابقت داشته باشد، بجز کلماتی که با حرف «a» شروع می‌شوند، می‌توان از الگوی آمده در پایین استفاده کرد.

^(?!a)w+$

در این الگوی RegEx، ابزار نگاه به جلوی منفی (?!a)

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

^(?=a)w+$

در این الگوی RegEx، ابزار نگاه به جلوی مثبت (?=a)

 برای تطابق با هر کلمه‌ای که با حرف «a» شروع می‌شود به‌کاربرده شده‌است. این روش انجام عمل انطباق الگو را روی رشته‌هایی که حاوی کاراکترهای مشخصی هستند، بسیار ساده‌تر می‌کند.

تطبیق دادن در چند خط

در زمان استفاده از RegEx-ها، بعضی وقت‌ها لازم داریم که الگوها را در طول چندین خط تطبیق دهیم. علامت نقطه .

 می‌تواند برای مطابقت با هر کاراکتری، از جمله کاراکتر «شکستن خطوط» (Line Breaks) -کاراکتری که به معنای پایان پاراگراف یا رفتن به خط بعد باشد- استفاده شود.

برای مثال، اگر به‌خواهیم الگویی طراحی کنیم برای مطابقت با هر جمله‌ای را که با کلمه «The» شروع می‌شود و با کلمه «end» به پایان می‌رسد، صرف نظر از اینکه چند خط را دربر می‌گیرد، می‌توانیم از RegEx زیر استفاده کنیم.

^The.*end$

در این الگوی RegEx، علامت نقطه .

 برای تطبیق با هر کاراکتری حتی شامل Line Breaks استفاده شده‌است. این روش امکان انجام عمل تطابق الگوها، روی رشته‌هایی که چندین خط را دربر می‌گیرند، به آسانی فراهم می‌کند.

استفاده از الگوهای بازگشتی

«الگوهای بازگشتی» (Recursive Patterns) این امکان را برای RegEx فراهم می‌کنند که الگوهای تکراری را در رشته‌ها تطبیق دهند. برای مثال این تکنیک برای انطباق «تگ‌های» (Tags) HTML بسیار کاربردی است. برای اینکه بیشتر و بهتر درک کنیم که کاربرد این روش در RegEx چیست به این فکر کنید که می‌خواهیم الگویی را طراحی کنیم که با هر تگ HTML0 با صفت «class» صرف نظر از محتویاتش مطابقت داشته باشد. لطفا به RegEx زیر توجه کنید.

<.*?class=".*?".*?>

در این الگوی RegEx، علامت‌های <

 و >

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

مثال هایی از الگوهای Regex

اکنون، درباره اینکه RegEx چیست و ابزار در دسترس RegEx-ها چیستند اطلاعات پایه‌ای دارید. زمان آن فرا رسیده که به بعضی از نمونه‌های ابتدایی RegEx-ها نگاهی بی‌اندازیم.

الگوی انطباق با شماره تلفن

اگر بخواهیم که RegEx طراحی کنیم تا با الگوی شماره تلفن‌های آمریکای شمالی منطبق باشد، می‌توانیم از RegEx زیر، استفاده کنیم.

^d{3}-d{3}-d{4}$

در این الگوی RegEx، کلاس کاراکتر d

 با هر رقمی از ۰ تا ۹ مطابقت دارد. تغییردهنده‌های {3}

 و {4}

 مشخص می‌کنند که الگو‌ باید، به ترتیب با سه و چهار رقم مطابق باشد. برای تطبیق الگوها با رشته‌هایی که شامل شماره تلفن‌های آمریکای شمالی باشند، این روش بسیار کارآمدی است.

الگوی انطباق با قالب تاریخ

اگر بخواهیم که الگویی برای تطبیق دادن با تاریخ -به شکل YYYY-MM-DD- درون رشته‌ها یا متن ایجاد کنیم، می‌توانیم از RegEx که در ادامه آمده است استفاده کنیم.

^d{4}-d{2}-d{2}$

در این الگوی RegEx، کلاس کاراکتر d

 با هر رقمی از ۰ تا ۹ منطبق است. تغییردهنده‌های {4}

 ، {2}

 و {2}

 مشخص می‌کنند که الگو‌ باید، به ترتیب شامل چهار، دو و دو رقم باشد. برای تطبیق الگوها با رشته‌هایی که شامل شماره تاریخ میلادی به این شکل باشند، این روش بسیار کارآمدی است.

الگوی انطباق با آدرس IP

اگر بخواهید بدانید بهترین الگو برای تطابق با آدرس IP در RegEx چیست به RegEx آمده در زیر توجه کنید.

^d{1,3}.d{1,3}.d{1,3}.d{1,3}$

در این الگوی RegEx، کلاس کاراکتر d

 با هر رقمی از ۰ تا ۹ منطبق است. جداکننده‌های {1,3}

 مشخص می‌کنند که هر عددی برای انطباق باید بین ۱ تا ۳ رقم باشد. این فرم به الگو اجازه می‌دهد تا با هر آدرس IP در رشته انطباق پیدا کند.

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

اگر برنامه‌ای می‌نویسید و باید بدانید راه حل طراحی الگویی که شماره کارت‌های معتبر عابربانک را از شماره‌های غیرمعتبر، تشخیص دهد در RegEx چیست می‌توانید از RegEx زیر استفاده کنید.

^d{16}$|^d{4}sd{4}sd{4}sd{4}$

در این الگوی RegEx، کلاس کاراکتر d

 با هر رقمی از ۰ تا ۹ منطبق است. جداکننده‌های {16}

 و {4}

 تعیین می‌کنند که الگو به ترتیب برای انطباق باید ۱۶ یا ۴ رقم باشد. البته که توجه دارید یا ۱۶ رقم یا ۴ عدد ۴ رقمی با یک فاصله خالی بین‌شان s

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

الگوی انطباق با همه تگ های HTML

اگر بخواهید بدانید بهترین الگو برای تطابق با همه تگ‌های HTML در RegEx چیست، در زیر نمونه‌ای از آن را آورده‌ایم.

</?w+((s+w+(s*=s*(?:".*?"|'.*?'|("')?(.*?)("')?))?)+s*|/?)>

در این الگوی RegEx، کلاس کاراکتری w

 با هر کاراکتر رقمی یا حروف الفبایی مطابقت دارد. جدا کننده‌های +

 ، *

 و ?

 به ترتیب به این معنا هستند که الگو برای انطباق به تعداد یک یا بیشتری از کاراکتر قبل از علامت +

 ، احتیاج دارد، الگو برای انطباق به تعداد صِفر یا بیشتری از کاراکتر قبل از علامت *

 ، احتیاج دارد و الگو برای انطباق به تعداد یک یا صِفر از کاراکتر قبل از علامت ?

 ، احتیاج دارد. این الگوی RegEx می‌تواند با تمام تگ‌های HTML در متن منطبق شود.

جمع‌بندی

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

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