در این راهنما ، regex یا نحو بیان منظم را خواهید آموخت. در پایان ، شما می توانید راه حل های regex را در بیشتر سناریوهایی که این کار را در کارهای توسعه وب خود ضروری می دانند ، اعمال کنید.
عبارات منظم موارد استفاده بسیاری دارند که عبارتند از:
- اعتبار سنجی ورودی
- تراشیدن وب
- جستجو و جایگزینی کنید
- فیلتر کردن اطلاعات در پرونده های متنی عظیم مانند سیاهههای مربوط
عبارات منظم ، یا regex همانطور که معمولاً نامیده می شوند ، برای کاربران جدید پیچیده و ترسناک به نظر برسند. نگاهی به این مثال بیندازید:
/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:.[a-zA-Z0-9-]+)*$/
این فقط مثل یک متن مخدوش است. اما ناامید نشوید ، پشت این جنون روشی وجود دارد.
اعتبار: xkcd
من به شما نشان خواهم داد که چگونه عبارات منظم را در کمترین زمان تسلط پیدا کنید. ابتدا بیایید اصطلاحات مورد استفاده در این راهنما را روشن کنیم:
- الگو: الگوی بیان منظم
- رشته: رشته آزمایشی که برای مطابقت با الگو استفاده می شود
- رقمی: 0-9
- حرف: az ، AZ
- سمبل:! $٪ ^ & * () _ + | ~ – = “{}[]: “؛ ‘<>؟ ،. /
- فضا: تک فضای سفید ، برگه
- شخصیت: به یک حرف ، رقم یا نماد اشاره دارد
اصول
برای یادگیری سریع regex با این راهنما ، به اینجا مراجعه کنید Regex101، جایی که می توانید الگوهای regex بسازید و آنها را در برابر رشته هایی (متن) که تهیه می کنید آزمایش کنید.
وقتی سایت را باز می کنید ، باید گزینه را انتخاب کنید جاوا اسکریپت طعم ، همان چیزی است که ما برای این راهنما استفاده خواهیم کرد. (نحو Regex بیشتر برای همه زبانها یکسان است ، اما تفاوتهای جزئی نیز وجود دارد).
بعد ، شما باید غیرفعال کنید global
و multi line
پرچم ها در Regex101. ما در بخش بعدی به آنها خواهیم پرداخت. در حال حاضر ، ما به ساده ترین شکل بیان منظم که می توانیم ایجاد کنیم ، نگاه خواهیم کرد. موارد زیر را وارد کنید:
- فیلد ورودی regex: گربه
- رشته تست: موش خفاش موش گربه نشسته چاق می خورد حصیر گربه تات CAT
توجه داشته باشید که عبارات منظم در JavaScript با شروع و خاتمه می یابند /
. اگر بخواهید یک عبارت منظم در کد JavaScript بنویسید ، به صورت زیر خواهد بود: /cat/
بدون هیچ علامت نقل قولی. در حالت فوق ، عبارت منظم با رشته “گربه” مطابقت دارد. با این حال ، همانطور که در تصویر بالا مشاهده می کنید ، چندین رشته “گربه” وجود دارد که با هم مطابقت ندارند. در بخش بعدی ، دلیل آن را بررسی خواهیم کرد.
پرچم های Regex جهانی و موردی
به طور پیش فرض ، یک الگوی regex فقط اولین مطابقت را پیدا می کند. اگر می خواهید مسابقات اضافی را برگردانید ، باید “” را فعال کنید جهانی پرچم ، به عنوان نشان داده شده است g
. الگوهای Regex نیز به طور پیش فرض به حروف کوچک بزرگ حساس هستند. با فعال کردن ، می توانید این رفتار را نادیده بگیرید بی احساس پرچم ، مشخص شده با i
. الگوی regex به روز شده اکنون بصورت کامل بیان می شود /cat/gi
. همانطور که در زیر می بینید ، تمام رشته های “گربه” از جمله موردی که مورد دیگری دارد با هم مطابقت دارند.
مجموعه شخصیت ها
در مثال قبلی ، ما یاد گرفتیم که چگونه دقیقاً موارد منطبق بر حروف بزرگ را انجام دهیم. اگر بخواهیم “خفاش” ، “گربه” و “چاق” را مطابقت دهیم چه می کنیم. ما می توانیم این کار را با استفاده از انجام دهیم مجموعه شخصیت ها، با نشان داده شده است []. در واقع ، شما چندین کاراکتر قرار داده اید که می خواهید با آنها مطابقت داشته باشند. مثلا، [bcf]at
با چندین رشته مطابقت خواهد داشت:
مجموعه کاراکترها نیز با رقم کار می کنند.
دامنه ها
بیایید فرض کنیم می خواهیم همه کلماتی را که به پایان می رسند مطابقت دهیم at
. ما می توانیم الفبای کامل را در داخل مجموعه کاراکترها عرضه کنیم ، اما این کار خسته کننده خواهد بود. راه حل این است که از محدوده هایی مانند این استفاده کنید [a-z]at
:
در اینجا رشته کاملی که آزمایش می شود وجود دارد: rat bat cat sat fat cats eat tat cat dog mat CAT
.
همانطور که مشاهده می کنید ، تمام کلمات مطابق انتظار پیش بینی می شوند. من کلمه را اضافه کردم dog
فقط برای پرتاب در یک مسابقه نامعتبر. در اینجا روش های دیگری وجود دارد که می توانید از دامنه ها استفاده کنید:
-
محدوده جزئی: انتخاب هایی مانند
[a-f]
یا[g-p]
. -
محدوده بزرگ:
[A-Z]
. -
محدوده رقمی:
[0-9]
. -
محدوده نماد: مثلا،
[#$%&@]
. -
دامنه مخلوط: مثلا،
[a-zA-Z0-9]
شامل تمام ارقام ، حروف کوچک و بزرگ است. توجه داشته باشید که یک محدوده فقط گزینه های مختلفی را برای a مشخص می کند شخصیت واحد در یک الگویبرای درک بیشتر نحوه تعریف دامنه ، بهتر است به جدول کامل ASCII نگاه کنید تا نحوه ترتیب کاراکترها را ببینید.
تکرار شخصیت ها
بیایید بگوییم شما می خواهید همه کلمات سه حرف را مطابقت دهید. احتمالاً این کار را می کنید مثل این:
[a-z][a-z][a-z]
این با تمام کلمات سه حرف مطابقت دارد. اما اگر بخواهید با یک کلمه پنج یا هشت کاراکتری مطابقت داشته باشید چه می کنید. روش فوق خسته کننده است. روش بهتری برای بیان چنین الگویی با استفاده از وجود دارد {}
بریس های حلقه ای علامت گذاری تمام کاری که شما باید انجام دهید این است که تعداد کاراکترهای تکراری را مشخص کنید. در اینجا نمونه هایی وجود دارد:
a{5}
با “aaaaa” مطابقت خواهد داشت.n{3}
با “nnn” مطابقت دارد.[a-z]{4}
با هر کلمه چهار حرفی مانند “در” ، “اتاق” یا “کتاب” مطابقت دارد.[a-z]{6,}
هر کلمه ای را با شش حرف یا بیشتر مطابقت می دهد.[a-z]{8,11}
با هر کلمه ای بین هشت تا 11 حرف مطابقت دارد. اعتبار سنجی رمز عبور اساسی را می توان از این طریق انجام داد.[0-9]{11}
با یک عدد 11 رقمی مطابقت دارد. اعتبار سنجی بین المللی تلفن اولیه را می توان از این طریق انجام داد.
شخصیت های متا به شما امکان می دهند الگوهای بیان منظمی را بنویسید که حتی جمع و جورتر هستند. بیایید یکی یکی از آنها عبور کنیم:
d
با هر رقمی که برابر است مطابقت دارد[0-9]
w
با هر حرف ، رقم و شخصیت زیر خط مطابقت داردs
با یک نویسه فضای سفید مطابقت دارد – یعنی یک فاصله یا یک تبt
فقط با یک کاراکتر تب مطابقت دارد
از آنچه تاکنون آموخته ایم ، می توانیم عباراتی منظم مانند این را بنویسیم:
w{5}
با هر کلمه پنج حرفی یا یک عدد پنج رقمی مطابقت داردd{11}
با یک شماره 11 رقمی مانند شماره تلفن مطابقت دارد
شخصیت های خاص
شخصیت های خاص ما را یک قدم جلوتر در نوشتن عبارات الگوی پیشرفته تر می برند:
-
+
: یک یا چند عدد تعیین کننده (کاراکتر قبلی باید وجود داشته باشد و به صورت اختیاری قابل کپی باشد). به عنوان مثال ، عبارتc+at
با “cat” ، “ccat” و “ccccccccat” مطابقت دارد. می توانید شخصیت قبلی را هر چند بار که دوست دارید تکرار کنید و همچنان مطابقت پیدا کنید. -
?
: صفر یا یک کم کننده (کاراکتر قبلی اختیاری است). به عنوان مثال ، عبارتc?at
فقط با “گربه” یا “در” مطابقت دارد. -
*
: کم کننده صفر یا بیشتر (نویسه قبلی اختیاری است و می تواند به صورت اختیاری کپی شود). به عنوان مثال ، عبارتc*at
با “at” ، “cat” و “ccccccat” مطابقت دارد. مثل ترکیب+
و?
. -
: این “شخصیت فرار” وقتی استفاده می شود که بخواهیم از یک کاراکتر خاص به معنای واقعی کلمه استفاده کنیم. مثلا،
c*
دقیقاً با “c *” مطابقت خواهد داشت و نه “ccccccc”. -
[^]
: این علامت “نفی” برای نشان دادن نویسه ای استفاده می شود که نباید در محدوده ای مطابقت داشته باشد. به عنوان مثال ، عبارتb[^a-c]ld
با “طاس” یا “bbld” مطابقت نخواهد داشت زیرا حرف دوم a تا c منفی است. با این حال ، الگوی “کمربند” ، “bild” ، “پررنگ” و غیره مطابقت خواهد داشت. -
.
: این علامت “انجام” با هر رقم ، حرف یا نماد به جز خط جدید مطابقت دارد. مثلا،.{8}
با یک رمز هشت کاراکتری متشکل از حروف ، اعداد و نمادها مطابقت دارد. به عنوان مثال ، “رمز عبور” و “P @ ssw0rd” هر دو مطابقت دارند.
از آنچه تاکنون آموخته ایم ، می توانیم انواع جالب توجهی از عبارات منظم جمع و جور اما قدرتمند را ایجاد کنیم. مثلا:
.+
با یک یا تعداد نامحدودی نویسه مطابقت دارد. به عنوان مثال ، “c” ، “cc” و “bcd # .670” همه مطابقت دارند.[a-z]+
با تمام کلمات حروف کوچک بدون در نظر گرفتن طول مطابقت دارند ، به شرطی که حداقل یک حرف داشته باشند. به عنوان مثال ، “کتاب” و “اتاق هیئت مدیره” هر دو با هم مطابقت دارند.
گروه ها
تمام کاراکترهای خاصی که ما فقط ذکر کردیم فقط بر یک شخصیت یا مجموعه محدوده تأثیر می گذارند. اگر بخواهیم این اثر برای a اعمال شود ، چه می شود بخش از بیان؟ ما می توانیم این کار را با ایجاد گروه ها با استفاده از براکت های گرد انجام دهیم – ()
. به عنوان مثال ، الگوی book(.com)?
از آنجا که قسمت “.com” را اختیاری قرار داده ایم ، با “book” و “book.com” مطابقت خواهد داشت.
در اینجا یک مثال پیچیده تر وجود دارد که می تواند در یک سناریوی واقع بینانه مانند اعتبار سنجی ایمیل استفاده شود:
- الگو:
@w+.w{2,3}(.w{2,3})?
- رشته تست:
abc.com abc@mail @mail.com @mail.co.ke
شخصیت های جایگزین
در regex ، می توانیم نویسه های جایگزین را با استفاده از نماد “pip” مشخص کنیم – |
. این با کاراکترهای خاصی که قبلا نشان دادیم متفاوت است زیرا بر تمام شخصیت های هر طرف نماد لوله تأثیر می گذارد. به عنوان مثال ، الگوی sat|sit
با هر دو رشته “نشستن” و “نشستن” مطابقت خواهد داشت. می توانیم الگوی را به صورت زیر بازنویسی کنیم s(a|i)t
برای مطابقت با همان رشته ها.
الگوی فوق را می توان به صورت زیر بیان کرد s(a|i)t
با استفاده از ()
پرانتز.
الگوهای شروع و پایان
ممکن است متوجه شده باشید که برخی از موارد مثبت نتیجه تطبیق جزئی است. به عنوان مثال ، اگر الگویی برای مطابقت با رشته “boo” نوشتم ، رشته “کتاب” نیز با وجود عدم تطابق دقیق ، مطابقت مثبتی پیدا می کند. برای رفع این مشکل ، از نمادهای زیر استفاده خواهیم کرد:
^
: در ابتدا قرار داده می شود ، این کاراکتر با یک الگوی ابتدای رشته مطابقت دارد.$
: قرار داده شده در انتها ، این کاراکتر با یک الگوی انتهای رشته مطابقت دارد.
برای رفع وضعیت فوق ، می توانیم الگوی خود را به صورت زیر بنویسیم boo$
. با این کار سه شخصیت آخر با الگوی مطابقت دارند. با این حال ، یک مشکل وجود دارد که ما هنوز در نظر نگرفته ایم ، همانطور که تصویر زیر نشان می دهد:
رشته “sboo” مطابقت پیدا می کند زیرا هنوز هم الزامات مطابقت الگوی فعلی را برآورده می کند. برای رفع این مشکل ، می توانیم الگوی زیر را به روز کنیم: ^boo$
. این کاملاً با کلمه “boo” مطابقت دارد. اگر از هر دو آنها استفاده کنید ، هر دو قانون اعمال می شوند. مثلا، ^[a-z]{5}$
کاملاً با یک کلمه پنج حرفی مطابقت دارد. اگر رشته بیش از پنج حرف داشته باشد ، الگو مطابقت ندارد.
Regex در JavaScript
const regex1=/a-z/ig
const regex2= new RegExp(/[a-z]/, 'ig')
اگر Node.js را روی دستگاه خود نصب کرده اید ، یک ترمینال را باز کنید و دستور را اجرا کنید node
برای راه اندازی مفسر پوسته Node.js. بعد ، به صورت زیر اجرا کنید:
با خیال راحت با الگوهای regex بیشتری بازی کنید. پس از اتمام ، از دستور استفاده کنید .exit
برای ترک پوسته.
مثال دنیای واقعی: اعتبار سنجی ایمیل
هنگامی که این راهنما را به پایان می رسانیم ، بیایید به یک استفاده محبوب از regex نگاه کنیم ، اعتبار ایمیل. (به عنوان مثال ، ممکن است بخواهیم بررسی کنیم آدرس ایمیلی که کاربر در فرم وارد کرده است ، آدرس ایمیل معتبری است).
این موضوع پیچیده تر از آن چیزی است که شما فکر می کنید. نحو آدرس ایمیل بسیار ساده است: {name}@{domain}
. از لحاظ تئوری ، یک آدرس ایمیل می تواند شامل تعداد محدودی از نمادها مانند #-@&%.
و غیره با این حال ، قرار دادن این نمادها مهم است. سرورهای نامه همچنین قوانین مختلفی در مورد استفاده از نمادها دارند. به عنوان مثال ، برخی از سرورها با +
نماد نامعتبر است. در سایر سرورهای نامه ، نماد برای استفاده می شود زیر آدرس ایمیل.
به عنوان یک چالش برای آزمایش دانش خود ، سعی کنید یک الگوی بیان منظم ایجاد کنید که فقط با آدرس های ایمیل معتبر مشخص شده در زیر مطابقت داشته باشد:
# invalid email
abc
abc.com
# valid email address
abc@mail.com
abc@mail.nz
abc@mail.co.nz
abc123@mail.com
abc.def@music.com
# invalid email prefix
abc-@mail.com
abc..def@mail.com
.abc@mail.com
abc#def@mail.com
# valid email prefix
abc-d@mail.com
abc.def@mail.com
abc@mail.com
abc_def@mail.com
# invalid domain suffix
abc.def@mail.c
abc.def@mail#archive.com
abc.def@mail
abc.def@mail..com
# valid domain suffix
abc.def@mail.cc
abc.def@mail-archive.com
abc.def@mail.org
abc.def@mail.com
fully-qualified-domain@example.com
برخی از آدرس های ایمیل را که به عنوان علامت گذاری شده اند ، یادداشت کنید معتبر ممکن است برای سازمانهای خاصی فاقد اعتبار باشد ، در حالی که برخی از آنها با عنوان مشخص شده اند بی اعتبار ممکن است در سازمانهای دیگر مجاز باشد. در هر صورت ، یادگیری ساخت عبارات منظم و سفارشی برای سازمانهایی که در آنها کار می کنید برای تأمین نیازهای آنها از اهمیت بالاتری برخوردار است. در صورت گیر افتادن ، می توانید به راه حل های زیر توجه کنید. توجه داشته باشید که هیچ یک از آنها 100٪ در رشته های آزمون ایمیل معتبر فوق الذکر با شما مطابقت ندارند.
^w*(-w)?(.w*)?@w*(-w*)?.w{2,3}(.w{2,3})?$
^(([^<>()[]\.,;:s@"]+(.[^<>()[]\.,;:s@"]+)*)|(".+"))@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}])|(([a-zA-Z-0-9]+.)+[a-zA-Z]{2,}))$
خلاصه
امیدوارم اکنون اصول عبارات منظم را یاد گرفته باشید. ما در این راهنمای سریع مبتدیان همه ویژگی های regex را بیان نکرده ایم ، اما شما باید برای مقابله با بیشتر مشکلاتی که به دنبال راه حل regex هستند اطلاعات کافی داشته باشید. برای کسب اطلاعات بیشتر ، راهنمای ما در مورد بهترین روشهای کاربرد عملی regex را در سناریوهای دنیای واقعی بخوانید.