موضوع: Regex یا Regular Expression
اول اینکه ریجکس چیه و چه کاربردی داره؟ ما با استفاده از ریجکس میتوانیم روی ورودیها محدودیت بگذاریم. مثلاً میگوییم اگر درون اینپوت شماره تلفن با 0912 شروع شد، آن را تایید کن یا مثلاً میگوییم اگر فامیلی طرف کاظمی بود، آن را رد کن.
مثال دیگر اعتبارسنجی لاگین است. مثلاً میگوییم پسورد شما باید شامل حروف باشد و یا باید شامل اعداد باشد و...
درسته که این را با یک دستور if و else میتوانیم به راحتی درست کنیم، اما ممکن است در آنجا کمی پیچیدهتر شود. ما برنامهنویسیم و برایمان مهم است که کدهایمان کوتاه و خوانا باشد و این کاری است که ریجکس برایمان انجام میدهد.
خب، بیایید سراغ یک مثال ساده. مثلاً من میخواهم از کاربر یک ورودی بگیرم و میگویم این ورودی باید شامل عدد و حروف الفبا باشد.
در حالت عادی باید بگوییم:
if (input == "a" || input == "b" || input == "c") return "this is string"
شاید هم از یک راه خیلی سادهتر بتوان این کار را انجام داد، اما این چیزی بود که الان به ذهنم رسید. 😅
حالا همین کار را با ریجکس انجام میدهیم:
let x = new RegExp(/[a-z]/g);
if (x.test(input.value)) return "I see a string"
حالا شاید تعجب کنید که این عبارات درهمبرهم چیست؟
اما خب، عادی است. چرا؟ چون همین دیروز خودم همین احساس را میکردم، اما امروز دارم آموزش میدهم.
بسیار ساده است. در دستور اول با استفاده از new میگوییم یک چیز جدید برایمان درست کن!
حالا این چیز جدید چیست؟ همان چیزی که بعد از این عبارت میآید میتواند هر چیزی باشد، مثلاً new Date().
من گفتم که یک ریجکس برایم درست کن که فیلتر باشد با عبارات داخل ریجکس.
در قدم اول برای استفاده از ریجکس باید از دستور / / (دو تا اسلش) استفاده کنید و فیلترهایی که مدنظر داریم را درونش قرار دهیم.
هر چیزی میتوانم قرار بدهم. مثلاً میگویم اگر حرف "alireza" را دیدی، بگو دیدمت:
const reg = new RegExp(/alireza/ig);
if (reg.test(input.value)) return "I see you"
من اینجا گفتم که اگر علیرضا را دیدی، بگو دیدمت. خب، حالا دستورات بعدیاش چه کاری میکند؟ مثلاً i یا g:
دستور i منظورش این است که حروف کوچک را هم شامل شود. یعنی اگر این را ننویسم و بعد بگویم Alireza، بعد بگویم console.log(reg)، من با false مواجه میشوم.
دستور بعدی g است به معنی global، یعنی اینکه تمام این عبارت را بگرد. مثلاً اگر g را نگذارم، یک بار اسم "alireza" را ببیند، دیگر در عبارت من نمیگردد. حالا کاربردش چیست؟
مثلاً ما یک پاراگراف طولانی داریم. میگوییم درون این پاراگراف هر چه حرف "a" تا "z" دیدی، رنگش را خاکستری کن. اما اگر global نباشد با یک بار دیدن حروف، همان را علامت میزند و داخل کل متن نمیگردد.
دستور بعدی \d و \D است.
دستور \D میگوید هر چیزی به جز عدد را دیدی، برایم برگردان. البته برنمیگرداند نتیجهاش یا false است یا true.
نحوه استفادهاش هم به این صورت است. مثل قبل یک ریجکس درست میکنیم با / /:
const reg = new RegExp(/\D/);
حالا پاراگراف ما این است:
const p = "Hello Mr Alireza"
حالا میگوییم که مقایسه را انجام بده:
if (reg.test(p)) return "I see string"
فکر میکنید نتیجه چیست؟
نتیجه true است اما مشکلی که دارد این است که فقط حرف H را میبیند. چرا؟
چون ما از دستور global استفاده نکردیم. پس برای اینکه برنامهمان درست کار کند، میگوییم:
const reg = new RegExp(/\D/ig);
و همچنین دستور i که به حروف کوچک و بزرگ حساس نباشد.
دوستان توجه کنید که درون اسلشها هر چیزی میتوانیم قرار دهیم. میتواند یک استرینگ باشد یا میتواند یک عدد باشد و هر چیز دیگری.
مثلاً:
const reg = new RegExp(/[0123456789]/g);
من اینجا گفتم که فیلتر شود با اعداد 0 تا 9. یعنی اگر اعداد 0 تا 9 باشد، به من دستور true برمیگرداند و اگر نباشد false است.
اما این کار یک اشکالی دارد. این است که فقط در صورتی که تمامی اعداد 0 تا 9 وجود داشته باشد، به من true برمیگرداند. در غیر اینصورت false.
مثلاً اگر بگویم "123" غلط است، ولی اگر بگویم "0123456789" درست است.
که این چیزی نیست که ما به آن نیاز داریم. پس راهکار چیست؟
باید از علامت [] استفاده کنیم و مقادیر را درون کروشه بگذاریم. مثلاً:
const reg = new RegExp(/[0-9]/g);
در این حالت روی اعداد 0 تا 9 فوکوس میشود و هر بار یا هر کجای متن که عددی ببیند، دستور true را برمیگرداند.
مثلاً میتوانم بگویم "123" یا "58466" یا هر عدد دیگری.
ما این کار را نه تنها روی اعداد بلکه روی استرینگ هم میتوانیم انجام دهیم:
مثلاً:
const regex = new RegExp(/[a-z]/g);
در اینجا بین عبارات "a" تا "z" میگردد و همچنین دستور i برای عدم حساسیت به حروف بزرگ و کوچک:
const regex = new RegExp(/[a-z]/ig);
نمونه الگوی دریافت ایمیل با استفاده از ریجکس:
/([a-z]+([0-9])*)@gmail\.com/
نمونه الگوی دریافت ادرس سایت با استفاده از ریجکس:
/(https?://)?(www\.)?([a-z 0-9 _ -]+)(.[a-z]{2,5})/
خب این مقاله هم به اتمام رسید امیدوارم که مفید بوده باشم ,موفق باشید