30 روز با Node - روز سوم: عبارت‌های منظم

20 مرداد 1397
node-regular-expression

مقدمه

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

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

تمامی موارد فوق می‌توانند به کمک عبارات منظم پیاده شوند.

ایجاد یک عبارت با قاعده (Regular Expression)

به دوشیوه می‌توان یک عبارت با قاعده ایجاد نمود:

۱) با خود عبارت با قاعده بصورت جزء به جزء حروف: در این حالت، الگوی تطابق بین دو اسلش محصور می‌شود. همانند زیر:

var reg = /ab*/;

این یعنی تطابق با a ، ab ، abb ، abbb ،  abbbb ، abbbbb و غیره

ولی نامطابق با b ، bc ، abc ،  aba و غیره

۲) با فراخوانی متد سازنده: در این حالت، الگوی تطابق، به همراه تابع سازنده RegExp بیان می‌شود. همانند زیر:

 var reg = new RegExp('ab*');

این الگو دقیقا مانند حالت قبلی عمل می کند.

چند مثال پرکاربرد

۱) می‌خواهیم متن مشخصی را پیدا کنیم. در این مثال یک فایل متنی داریم که به عنوان داده مرجع (dataset) از آن استفاده می کنیم. آن را به روش همزمان خوانده و محتوا را در متغیر str ذخیره می‌کنیم. سپس، الگویی فراهم می‌کنیم که در فایل متنی مذکوربه دنبالش بگردیم. در این حالت، عبارت الگو برابر با "man" بوده که درادامه‌ی آن تعدیل کننده‌های regex را به صورت زیر برای الگو به کار می‌بریم:

  • g : کل محدوده
  • i : غیرحساس به بزرگی و کوچگی حروف
  • m : تطابق چندخطی

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

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

var fs = require('fs');
var filename = 'data.txt';
var str = fs.readFileSync(filename).toString();
var pattern = /man/gim;
var myarray = str.match( pattern );
var len = myarray.length;
console.log("Occurrences of pattern in the string is : " + len);

۲) یافتن تعداد برچسب‌ها در یک فابل: فایل دیتاست در این مثال data.html است. این مثال تا حدودی شبیه به قبلی است بجز اینکه:

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

قطعه کد زیر را ببینید:

var fs = require('fs');
var filename = 'data.html';
var str = fs.readFileSync(filename).toString();
var pattern = /<(\"[^\"]*\"|'[^']*'|[^'\">])*>/gim;
var myarray = str.match( pattern );
var len = myarray.length;
console.log("Occurrences of pattern in the string is : " + len);

۳) اعتبارسنجی ایمیل‌ها: در اینجا نشانی یک ایمیل را بعنوان ورودی می‌دهیم تا ببینیم آیا تمام شرایط یک ایمیل معتبر را داراست یا خیر. الگوی ما، باید برخی الزامات همچون وقوع یک علامت @، وجود دامنه یا زیردامنه و غیره را برآورده سازد. بعد از تطابق، جنانچه ایمیل، معتبر باشد، پیام "Valid" و درغیر اینصورت پیام "Please enter a valid email" را درخروجی کنسول نمایش خواهد داد.

قطعه کد آن نیز به شرح زیراست:

var str = 'fakedemo@roxo.ir'
var pattern = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
var res = str.match( pattern );
if(res)
{
    console.log("Valid email address");
}
else
{
    console.log("Please enter a valid email address");
}

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

۴) اعتبارسنجی یک عدد هگزادسیمال: این نیز یک مثال بسیار متعارف است. در اینجا رشته‌ای را  اعتبارسنجی و بررسی می‌کنیم که آیا می‌تواند یک عدد هگزادسیمال باشد یا خیر. به یاد دارید که ارقام یک عدد هگزادسیمال محدود به موارد زیر است:

  • ارقام [0-9]
  • حروف [A-F]
  • حروف [a-f]

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

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

var str = 'FFFFFF'
var pattern = /^[a-fA-F0-9]+$/g;
var res = str.match( pattern );
if(res)
{
     console.log("Valid Hexadecimal number");
}
else
{
     console.log("Not a valid Hexadecimal number");
}

۵) اعتبار سنجی رمز عبور:  به کمک عبارات منظم این امر انجام پذیر است. رمزهای عبور باید قوی باشند، به همین خاطر یاید معیارهایی همچون زیر فراهم کنیم:

  • رمزعبور باید یک حرف بزرگ A  تا Z داشته باشد.
  • رمز عبور باید یک حرف کوچک a تا z داشته باشد.
  • رمز عبور باید یک رقم 0 تا 9 داشته باشد.
  • رمز عبور باید یک کاراکتر ویژه [!,@,#,$,%,^,. . . ]  داشته باشد.
  • طول رمز عبور باید بین 6 تا 16 کاراکتر باشد.

بنابراین باید عبارت با قاعده ای را تولید کنیم که به کمک آن بتوانیم بررسی کنیم آیا رمز عبور تمام شرایط را برآورد می‌کند یا خیر. در قطعه کدی که در زیر آمده، اگر رمز عبور ساخته شده، شرایط را برآورد کند، پیام "Valid password" چاپ می شود و در غیر اینصورت حتی اگر تنها یکی از شرایط فوق هم برقرار نباشد، پیام "invalid password" در خروجی کنسول نمایش داده می‌شود. قطعه کد را ببینید:

var str = 'Aa#1aaabcde'
var pattern = /^(?=.*[0-9])(?=.*[!@#$%^&*])[a-zA-Z0-9!@#$%^&*]{6,16}$/;;
var res = str.match( pattern );
if(res)
{
    console.log("Valid password");
}
else
{
     console.log("Not a valid password");
}

خلاصه

در این قسمت از سری آموزش‌های نود جی اس موارد زیر را فراگرفتیم:

  • مفهوم عبارت های با قاعده یا Regular Expression
  • ایجاد یک عبارت با قاعده:
    1. به کمک جزء به جزء حروف عبارت با قاعده
    2. به کمک متد و تابع سازنده
  • مثال‌های متعارف عبارات با قاعده:
    1. یافتن متن مشخص به کمک عبارات با قاعده
    2. یافتن تعداد تگ‌ها به کمک عبارات با قاعده
    3. اعتبارسنجی ایمیل به کمک عبارات با قاعده
    4. اعتبارسنجی عدد هگزادسیمال به کمک عبارات با قاعده
    5. اعتبارسنجی استحکام رمز عبور به کمک عبارات با قاعده
نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.