regex

آموزش Regex به همراه مثالهای کاربردی

عبارتهای منظم یا Regex چیست؟

عبارت های منظم یا Regular Expressions یا به اختصار Regex برای استخراج متن و یا مطابقت متن با الگوی خاص کاربرد دارند.

برای مثال می خواهیم بدانیم که آیا مقدار وارد شده از طرف کاربر ایمیل می باشد یا نه. به این صورت که الگو یا Regex ایمیل را به تابع می دهیم. اگر مقدار ورودی با الگو مطابقت داشته باشد ایمیل صحیح می باشد. یا می خواهیم عبارتی را در رشته طولانی جستجو کنیم.

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

یکی از قابلیتهای این عبارت های منظم یا regex ها این است که تقریبا در تمامی زبانهای برنامه نویسی ساختار آن شبیه به هم می باشد. تنها تفاوت در این است که برخی زبان‌ها از برخی قابلیت‌های پیشرفته‌تر و نسخه‌های ساختار متفاوت پشتیبانی می‌کنند.

در این آموزش regex ما از زبان PHP استفاده خواهیم کرد اما شما می توانید در هر زبان دیگری از آنها استفاده کنید.

مقدمات Regex

الگوهای regex از قسمتهای ساده ای تشکیل شده است که می توان آنها را با هم ترکیب کرد. در جدول زیر چند مفهوم ساده به طور مختصر توضیح داده شده است.

Regexتوضیحات
[0-9]با هر رقم اعشاری از 0 تا 9 مطابقت دارد.
[a-z]با هر کاراکتر از حروف کوچک از a تا z کوچک مطابقت دارد.
[A-Z]با هر کاراکتر از حروف بزرگ از A تا Z بزرگ مطابقت دارد.
[a-Z]با هر کاراکتر از حروف کوچک از a تا Z بزرگ مطابقت دارد.

مثال

$str="2. hello world!";
$pattern = "/[0-9]/";
echo preg_match($pattern, $str);   =>  1

خروجی این تابع عدد یک می باشد چون در متن حداقل یک عدد (عدد 2) مشاهده شده است.

$str="hello world!";
$pattern = "/[0-9]/";
echo preg_match($pattern, $str);  =>  0

خروجی این تابع عدد صفر است چون در متن هیچ عددی مشاهده نشده است.

$pattern = "/[0-9a-z]/";

$str="hello world!";
echo preg_match($pattern, $str);   =>  1

$str="#############";
echo preg_match($pattern, $str);   =>  0

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

رشته دوم شامل حرف و یا عدد نیست بخاطر همین خروجی عدد صفر می باشد.

$pattern = '/([0-9][a-z])/';

$str="2hello world!";
echo preg_match($pattern, $str);   =>  1

$str="2 hello world!";
echo preg_match($pattern, $str);   =>  0

این regex زمانی درست است که متن شامل هم عدد و هم حروف باشد اما نکته ای که اینجا باید مد نظر داشته باشید این است که عدد باید به حرف چسبیده باشد و نباید فاصله ای بین آنها باشد.

در ادامه برای عباراتی که بین اعداد و حروف فاصله وجود دارد مثالی خواهیم داشت.

حروف فارسی

برای تولید الگوی حروف فارسی می توان به صورت زیر عمل کرد

$pattern = "/[آابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهیئ]/";
$str = "Hello World باهنر!";
echo preg_match($pattern, $str);   =>  1

در قسمت الگو تمام حروف فارسی را وارد می کنیم تا در متن هر زمان کلمه فارسی مشاهده کرد آن را تطبیق دهد.

$pattern = "/[٠١٢٣۴۵۶٧٨٩]/";
$str = "آیا در متن عدد ٢ وجود دارد؟";
echo preg_match($pattern, $str);   =>  1

خروجی این تابع هم عدد یک می باشد زیرا در متن عدد 2 وجود دارد.

نکته: برخی از کدهای یونیکد استفاده می کنند، در برخی زبانها کدهای یونیکد با ایراداتی همراه هستند.

اصلاح کننده ها یا همان فلگها

اصلاح کننده ها یا modifiers مواردی هستند که مشخص می کنند نحوه مطابقت چگونه باشد. برای مثال حساس به حروف بزرگ و کوچک باشد یا نه. در انتهای عبارت منظم می‌توان یک فلگ با مقادیر زیر تعیین کرد.

اصلاح کنندهتوضیحات
iجستجوی حساس به حروف بزرگ را انجام می دهد
mجستجوی چند خطی را انجام می دهد
uمطابقت صحیح الگوهای رمزگذاری شده UTF-8 را فعال می کند
oفقط یک بارارزیابی می شود
sاجازه استفاده از نقطه (.) برای مطابقت با سطر جدید
xبه شما امکان می دهد از فضای خالی برای بیان وضوح استفاده کنید
gپس از نخستین تطبیق بازگشت نمی‌یابد و جستجوهای بعدی را از انتهای مورد مطابقت قبلی آغاز می‌کند.
cgاجازه می دهد جستجو بعد از عدم تطابق نیز ادامه داشته باشد

مثال

$pattern = "/hello/i";
$str = "Hello World!";
echo preg_match($pattern, $str);   =>  1

$pattern = "/hello/";
$str = "Hello World!";
echo preg_match($pattern, $str);   =>  0

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

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

منابع:

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.