ما در مجله فرادرس پیش‌تر مقالات متعددی در مورد اهمیت و ماهیت ریجکس (Regex) به رشته تحریر درآورده‌ایم و کاربردهای آن را نیز با ارائه راهنماهای عملی مختلف بیان کرده‌ایم. اما هر چه از اهمیت ریجکس گفته شود، کم است. در این مقاله به بررسی 3 ریجکس مفید برای توسعه‌دهندگان وب می‌پردازیم.

قبل از هر چیز باید توضیح بدهیم که همه مثال‌های مطرح شده در این راهنما با استفاده ابزار آنلاین regexr (+) تست شده‌اند. همچنین بهتر است آشنایی قبلی با موارد زیر داشته باشید:

  • تعیین موقعیت ریجکس مانند ^ و $
  • مجموعه کاراکترها مانند [a-z] و [A-Z]
  • تعیین کمیت مانند *، + و?
  • جایگزینی مانند {5} و {2,} {1,3}
  • گروه‌ها مانند s (?=abc)
  • تغییراتی مانند ab | cd

با ما همراه باشید تا با 3 ریجکس مهم برای توسعه‌دهندگان وب آشنا شوید.

ریجکس تائید ایمیل

برای تائید صحت نشانی ایمیل می‌توانید از ریجکس زیر استفاده کنید:

کاربرد این ریجکس در کد به صورت زیر است:

توضیح

در این ریجکس از دو کاراکتر anchor به صورت زیر استفاده شده است:

  • علامت ^ برای نشان دادن ابتدای رشته.
  • علامت $ برای نشان دادن موقعیت انتهای رشته.

برای تفهیم بیشتر به مثال زیر توجه کنید:

دیکشنری

  • مجموعه کاراکتر [a-zA-Z0-9._%-] – در ریجکس فوق استفاده شده است که a-z با مجموعه کاراکترهای الفبایی از a تا z تطبیق می‌یابد و به کوچکی/بزرگی حروف حساس است. همچنین A-Z با کاراکترهای الفبایی از A تا Z تطبیق می‌یابد که باز حساس به کوچکی/بزرگی حروف است.
  • در ادامه 0-9 آمده است که با ارقام 0 تا 9 تطبیق پیدا می‌کند.
  • سپس کاراکتر (.) را می‌بینیم که با همان کاراکتر نقطه تطبیق پیدا می‌کند.
  • در ادامه کاراکتر زیرخط (_) را شاهد هستیم که با خود این کاراکتر در رشته تطبیق پیدا می‌کند.
  • کاراکتر % نیز با خود کاراکتر تطبیق می‌یابد.
  • همچنین کاراکتر خط تیره (-) با خود کاراکتر تطبیق می‌یابد.

در مورد مجموعه کاراکترها باید به حالت‌های زیر توجه کنید:

  • [abc] – با هر یک از حروف a، b یا c تطبیق می‌یابد.
  • [^abc] – با هر یک از حالت‌هایی که شامل a، b یا c نباشد تطبیق می‌یابد.
  • [a-g] – با کاراکترهای بین a تا g تطبیق می‌یابد.

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

در ادامه ریجکس‌های کمیت‌ساز را بررسی می‌کنیم. در ریجکس فوق شاهد [a-zA-Z0-9._%-]+ هستیم.

  • *a – نشانگر 0 یا چند مورد از توکن قبل خود است.
  • -a – نشانگر 1 یا چند مورد از توکن قبل خود است.

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

در این بخش ریجکس‌های مرتبط با جایگزینی را بررسی می‌کنیم. در ریجکس فوق شاهد توکنی به صورت a-zA-Z]{2,6} هستیم که توضیحات آن به صورت زیر است:

  • a{5} – دقیقاً با 5 بار تطبیق می‌یابد.
  • a{2,} – با 2 مورد یا بیشتر تطبیق می‌یابد.
  • a{1,3} – بین 1 تا 3 بار تطبیق می‌یابد.

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

موارد دشوار

توجه کنید که برخی نشانی‌های ایمیل نادرست پیچیده وجود دارند که ممکن است از سد اعتبارسنجی ریجکس فوق رد شوند. به مثال زیر توجه کنید:

این مثال همان طور که در کد زیر می‌بینید از سد ریجکس اعتبارسنجی قبلی عبور می‌کند:

ریجکس اعتبارسنجی پیشرفته ایمیل

برای این که بتوانیم نقیصه ریجکس قبلی را برطرف کنیم باید از یک کمیت‌ساز (Quantifier) پیشرفته به صورت زیر استفاده کنیم:

بدین ترتیب در صورتی که گروه () بیش از یک بار آمده باشد، این رشته از تست ما موفق بیرون نمی‌آید:

3 ریجکس مفید برای توسعه دهندگان وب

پیچیدگی رمز عبور

در این بخش یک ریجکس مفید دیگر را برای توسعه‌دهندگان فرانت‌اند معرفی می‌کنیم. این ریجکس میزان پیچیدگی و قدرت یک رمز عبور را بررسی می‌کند:

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

دیکشنری

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

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

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

گروه‌ها و پیش‌نگری مثبت

  • (abc) – به دست آوردن گروه
  • (?=abc) – بررسی مثبت بودن.

گروه‌ها

به دست آوردن گروه‌ها: گروه‌ها ترکیبی از چند توکن هستند و ایجاد یک کپچر گروه برای استخراج زیررشته یا استفاده از ارجاع به قبل استفاده می‌شود:

پیش‌نگری مثبت

در «پیش‌نگری مثبت» (Positive lookahead) یک گروه پس از عبارت اصلی بدون این که در نتیجه جای بگیرد، تطبیق می‌یابد. ساختار کار به صورت X(?=Y) است یعنی «به دنبال X بگرد، اما تنها در صورتی آن را تطبیق بده که پس از Y آمده باشد» یا به عبارت دیگر:

  1. X را پیدا کن.
  2. بررسی کن آیا Y درست پس از X آمده باشد (اگر چنین نبود، رد شو)
  3. بررسی کن آیا Z نیز دقیقاً پس از X آمده است (اگر چنین نبود، رد شو)
  4. اگر هر دو تست پاس شد، در این صورت X تطبیق یافته، در غیر این صورت به جستجو ادامه بده.

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

توجه کنید که خواندن از انتها سریع‌تر است. در ریجکس زیر نقطه (.) با هر کاراکتری به جز کاراکتر line break تطبیق پیدا می‌کند. با این فرض در رشته hel\nlo\n1 کاراکتر نقطه با شش کاراکتر عبارت به جز شکستگی خطوط تطبیق می‌یابد.

بدین ترتیب ریجکس فوق با هر عبارت کاراکتری (0 یا چند کاراکتر) که پس از آن عدد آمده باشد تطبیق می‌یابد و لذا helloworld1 و 123 تطبیق پیدا می‌کنند.

به عبارت دیگر می‌توانیم ریجکس زیر را به چند «اطراف‌نگری مثبت» (positive lookaround) تجزیه کنیم:

نتیجه کار به صورت زیر است:

چنان که می‌بینید 5 گروه از اطراف‌نگری مثبت به صورت حریصانه (greedily) به دنبال تطبیق‌های خود می‌گردند و تست ریجکس تنها در صورتی پاس می‌شود که همه معیارها تطبیق یابند.

در نهایت باید اشاره کنیم که در ریجکس فوق، در بخش.{8,} کاراکتر (0) تنها ریجکس خارج از اطراف‌نگری مثبت است و در واقع نقطه شروع واقعی ریجکس محسوب می‌شود. این توکن به دنبال هر کاراکتری به جز کاراکتر newline می‌گردد.

همچنین {8,} یک جایگزینی است که نماینده 8 حرف یا بیشتر است.

تاریخ‌ در قالب YYYY-MM-dd

سومین و آخرین ریجکسی که در این مقاله معرفی می‌کنیم و برای توسعه‌دهندگان فرانت‌اند مفید و مهم است به صورت زیر است:

ریجکس فوق برای regexr نوشته شده است، اما برای این که در جاوا اسکریپت کار کند باید یک \ اضافی در ابتدای \d اضافه کنید، زیرا از آن به صورت یک رشته در RegExp در جاوا اسکریپت استفاده می‌کنیم:

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

دیکشنری

ابتدا شاهد یک توکن جایگزین به شکل ab | cd هستیم که با ab یا cd تطبیق می‌یابد. بنابراین ریجکس زیر را می‌توان به سه بخش تجزیه کرد که با \ از هم جدا شده‌اند:

نتیجه تجزیه به صورت زیر است:

این ریجکس شبیه یک دسته از گزا‌ره‌های if است.

  • در بخش اول شاهد توکن ([12]\\d{3} هستیم که مشخص می‌سازد حرف اول باید یکی از ارقام 1 یا 2 باشد [12] و سپس در ادامه باید سه رقم آمده باشد \\d{3}.
  • در گزاره if دوم شاهد (0[1-9]|1[0-2]) هستیم که مشخص می‌کند این عبارت باید با 0 و یا 1 آغاز شود. اگر با 0 آغاز شود رقم بعدی باید درباره 1 تا 9 باشد، اما گر با 1 آغاز شود، در این صورت رقم بعدی باید در بازه 0 تا 2 باشد.
  • گزاره if سوم به صورت (0[1-9]|[12]\\d|3[01])) است که مشخص می‌سازد عبارت باید با 0 آغاز شود یا با 1 یا 2 آغاز شود و یا با 3 آغاز شود.
  • اگر عبارت با 0 آغاز شود، رقم بعدی باید در بازه 1 تا 9 باشد.
  • اگر با 1 یا 2 آغاز شود، رقم بعدی می‌تواند هر رقمی \d [0-9] باشد.
  • اگر با 3 آغاز شود، رقم بعدی باید 0 یا 1 باشد.

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

اگر این مطلب برای شما مفید بوده است، آموزش‌ها و مطالب زیر نیز به شما پیشنهاد می‌شوند:

میثم لطفی (+)

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

بر اساس رای 1 نفر

آیا این مطلب برای شما مفید بود؟

نظر شما چیست؟

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