MohammadAli Khaksar
MohammadAli Khaksar
خواندن ۶ دقیقه·۵ سال پیش

عبارت های منظم در جاوا اسکریپت , Regular expressions in javascript

قسمت اول


ساخت یک عبارت منظم و ازمایش منطبق بودن آنها

برای ساخت یا تعریف عبارت منظم (regular expressions) دو راه داریم

1-استفاده از شی RegExp

2-استفاده از فوروارد اسلش(//)

مثال:

let first=new RegExp(&quotabc&quot);
let second=/abc/;

هر دوی این مثال ها یک کار رو انجام میدن فقط ی نکته ای هست:

وقتی شما از شی RegExp استفاده میکنید اگر از n\ استفاده کنید ی خط فاصله ایجاد خواهد کرد چون مقادیر درون شی RegExp به عنوان یک استرینگ معمولی تعریف میشن چون بین دابل یا سینگل کتیشن قرار میگیرن .

اما زمانی که از فوروارد اسلش استفاده میکنید و از شی RegExp استفاده نمیکنید n\ تاثیری نخواهد داشت و مانند یک استرینگ در نظر گرفته میشود مثال های زیر را ببینید:

let first = new RegExp('abc\ndef'); console.log(first); output: /abc def/ let second = /abc\ndef/; console.log(second); output: /abc\ndef/

یکی از متدهایی که در regular expressions وجود داره متد test هست که بررسی میکنه که ایا کاراکتر هایی که بهش میدید جزئی از عبارت منظم هست یا نه مثال زیر رو ببینید

console.log(/abc/.test(&quot123abcde&quot)); // → true console.log(/abc/.test(&quotabxde&quot)); // → false

اولی true شد چون ترتیب بین حروفی که در متد تست قرار گرفته مانند عبارت منظم هست و کاراکتر های قبل و بعدش ربطی به اون 3 کاراکتر متوالی ندارند.

دومی هم false خواهد بود زیرا ترتیب رعایت نشده .

نکته: اگر بین مقادیری که در مثال اول درون متد test داده شد space (فاصله) قرار دهیم خروجی false خواهد شد زیرا همانطور که گفتیم ترتیب بین کاراکتر ها باید رعایت شوند.

مجموعه ها و کاراکتر ها

در عبارات های منظم قرار دادن مجموعه ای از کاراکتر های بین square bracket [ ] باعث میشه که هر یک از کاراکتر هایی که بین اون مجموعه هستند قابل دسترسی یعنی طبق مثال اول و دوم از 0 تا 9 هر عددی باشه قابل دسترسیه مثال های زیر رو ببینید


example 1: let first=/[0-9]/; console.log(first.test('2020');//true example 2: let second = /[0123456789]/; console.log(second.test('2020'));//true example 3: let second = /[a-z A-Z]/; console.log(second.test('hello ALI')); //true

نکته : حتما باید از دش یا خط تیره (-) استفاده شود زیرا به معنای رنج (محدوده ای ) از اعداد یا کاراکتر ها خواهد بود.

چندین شورتکات(میانبر) وجود دارد که همانطور که میدونید کار مارو اسان تر میکنند:

\d هر عددی البته فعلا فقط اعداد لاتین \w هر کاراکتری که الفبایی باشه و باهاش کلمه درست میشه البته فعلا فقط کاراکترهای انگلیسی \s فاصله یا تب یا خط جدید \D هر کاراکتری که عدد نباشه \W هر کارکتری که الفبایی نباشه یعنی شامل کارکترهایی که باهاش کلمه ایجاد میشن نباشه \S فاصله یا تب یا خط جدید نباشه . (dot) هر کاراکتری بحز خط جدید

مثال:

let date = /\d\d-\d\d-\d\d\d\d \d\d:\d\d/; console.log(date.test('30-03-2020 13:24'));//true console.log(date.test(&quot30-jan-2003 15:20&quot));//false

این مثال واقعا گیج کنندست.

برای اطمینان حاصل کردن از اینکه تعداد ارقامی که داده میشه دقیق هست باید بعد از d\ از براکت {} استفاده کنیم برای مثال اگر بخواهیم مقادیری که به متد testداده میشن 2 یا 4 رقم باشند حداقل مقداری که میتوان به متد تست داد 2 رقم مثلا 23 و بیشترینش 4 تا هست مثلا 2341

let dateTime = /\d{1,2}-\d{1,2}-\d{4} \d{1,2}:\d{2}/; console.log(dateTime.test(&quot22-03-2003 8:45&quot));//true

این روش واقعا عالیه فرض کنید بخواید 100 رقم داشته باشید با استفاده از مثال بالا باید 100 تا d\ بنویسید اما با این روشی که مثالش رو هم بالاتر گفتیم فقط

\d{1,100}

را مینویسید.

نکته مهم: چنانچه اگر شما به المنت اول که مقدار 22 بهش داده شده یک مقدار عددی دیگه اضافه کنید مثلا بجای 22 بنویسید 2222 یا هر عدد دیگه با هر تعداد رقمی بازهم جواب true خواهد بود همچنین بجای المنت اخر که 45 هست نیز هر عددی با هر رقمی بنویسید بازم جواب true خواهد بود برای حل این مشکل باید از علامت های caret(^) و dollar ($) استفاده کنید علامت ^ در ابتدای پترن قرار میگیره و علامت & در پایان پترن البته داخل // ها باید باشند.

مثال :

let dateTime = /^\d{1,2}-\d{1,2}-\d{4} \d{1,2}:\d{2}$/; console.log(dateTime.test(&quot22-30-2003 8:41&quot)); //true console.log(dateTime.test(&quot444-30-2003 8:41&quot)); //false

تکرار کردن بخشی از الگو(پترن)

زمانی که شما از علامت بعلاوه (+) بعد از هر مقدار عبارت منظمی استفاده میکنید به این معنیه که اون المنت ممکنه بیش از یکبار مقدار داده بشه مثال زیر رو ببینید :

let oops = /\d+/; console.log(oops.test(213123));//true

البته بجای استفاده از علامت + میشه از روش دیگه ایم استفاده کرد که پیشنهاد نمیشه .مثال زیر خط دوم رو ببینید :

let str = /^\d+$/; //-> 1 رقم تا هر تعداد رقم let str1 = /^\d{1,}$/; //-> 1 رقم تا هر تعداد رقم console.log(str.test(12312));//true console.log(str1.test(12312));//true
در واقع در مثال بالا نیازی به استفاده از caret (^) و dollar($) نبود اما پیشنهاد میشه در مواردی مثل مثال پایین یا مثال هایی که بالاتر زدیم قرارش بدید چون این علائم پترن رو محدود میکنن و ورودی هایی که به پترن داده میشن نمیتونن بیش از محدوده ای که شما براشون تعیین کردین کم یا زیاد بشن.

اگر بخواهید یکی از کاراکترها رو اختیاری کنید یعنی بگید اگر بود فلان اتفاق بیفته اگر نبود هیچ اتفاقی نیفته از علامت سوال (?) استفاده میکنید مثال زیر رو ببینید :

let str = /^colou?r$/; console.log(str.test(&quotcolor&quot));//true console.log(str.test(&quotcolour&quot));//true

در پترن بالا ما اومدیم حرف u رو اختیاری کردیم گفتیم اگ u درخط 2 بود که خروجی بده اونم شده true اگرم u نبود که هیچکاری نکن

و همانطور که تو خط 1 میبینید u به متد test داده نشده و روی خروجی هم تاثیری نذاشته.


دسته بندی عبارات , Grouping subexpressions

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

let cartoonCrying = /boo+(hoo+)+/i; console.log(cartoonCrying.test(&quotBooooohoooohoooohooo&quot)); //ture


در این پترن ما خواستیم که hoo به تعداد نامشخصی تکرار بشه به همین دلیل اونو بین پرانتز گذاشتیم و بعلاوه بغل o که توی پرانتز هست برای تکرار نامشخص o هست و بعلاوه بعد از پرانتز مربوط به تکرار نامشخص hoo هست
flag(پرچم) i هم که بعد forward slash (/) آمده به معنای اینکه که پترن case-insensitive نباشه یعنی به حروف بزرگ و کوچک حساس نباشه


پایان بخش اول





Regular expressionsعبارت های منظم در جاوا اسکریپتRegular expressions in javascripاموزش عبارت های منظم در جاوا اسکریپت
برنامه نویس و طراح وب , عاشق سفر به دنیای درون و کشف حقایق بیشتر...
شاید از این پست‌ها خوشتان بیاید