رجکس چیست؟ توضیح به زبان آدمیزاد، با مثال‌های اجراشده
آموزش

رجکس چیست؟ توضیح به زبان آدمیزاد، با مثال‌های اجراشده

اگر باید از یک متن طولانی همه‌ی شماره‌موبایل‌ها را دربیاوری، رجکس کار را به چند علامت کوچک می‌رساند؛ الگو را می‌نویسی و موتور جست‌وجو بقیه‌اش را می‌کند

تحریریه‌ی دینا کد
نویسنده
۵ دقیقه مطالعه۳ بازدید
اشتراک گذاری۳
فهرست مطالب
  1. ۱چطور با رجکس شماره موبایل‌ها را از متن بیرون بکشم؟
  2. ۲اجزای regex کدام‌اند و هر کدام چه می‌گویند؟
  3. ۳چه‌وقت سراغ regex نرویم؟
  4. ۴الگوی regex را کجا سریع تست کنم؟

یک فایل چندصدخطی وسط کارت است و باید از لابه‌لایش همه‌ی شماره‌موبایل‌ها را بیرون بکشی. رجکس دقیقاً برای همین لحظه ساخته شده. رجکس چیست؟ یعنی شکلِ چیزی را که می‌خواهی با چند علامت کوچک توصیف کنی؛ بعد موتور جست‌وجو هر تکه‌ای از متن را که با آن توصیف می‌خواند پیدا می‌کند.

سه جا بیشترین استفاده را دارد. در جست‌وجو، وقتی تکه‌های هم‌شکل را از لابه‌لای متن درمی‌آوری. در بررسی فرم، وقتی می‌خواهی مطمئن شوی ورودی کاربر شبیه شماره موبایل است یا نه. و در جایگزینی، وقتی ده‌ها تکه را یک‌جا عوض می‌کنی. پایتونش ماژول re است و جاوااسکریپت RegExp دارد؛ ایده‌ی اصلی در همه‌ی زبان‌ها یکی است و همین‌جا همان را یاد می‌گیری.

چطور با رجکس شماره موبایل‌ها را از متن بیرون بکشم؟

با یک مثال واقعی شروع کن؛ این کد را همان‌طور که هست می‌توانی اجرا کنی:

pythonimport re

matn = "شب 09121234567 تماس گرفت و پیام داد؛ شماره‌ی دفترش 02188776655 است."
print(re.findall(r"09\d{9}", matn))

خروجی:

['09121234567']

الگو تکه‌تکه خوانده می‌شود. دو کاراکتر اول عدد ۰ و ۹ هستند، بعد \d می‌گوید هر رقمی، بعد {9} می‌گوید همین گرفتن رقم دقیقاً نُه بار تکرار شود. شماره‌ی دفتر با ۰۲ شروع می‌شود و از همان دو رقم اول با الگو جور درنمی‌آید. هر رجکسی را با همین تقسیم‌بندی بخوان؛ اگر یک‌جا نگاهش کنی فقط رشته‌ای از علامت‌های غریبه می‌بینی.

اجزای regex کدام‌اند و هر کدام چه می‌گویند؟

این هفت علامت را بشناسی، بیشتر الگوهای رایج را می‌خوانی:

علامت یعنی اجرا که بکنی
\d هر رقمی، حتی ارقام فارسی روی «سال ۱۴۰۵» برمی‌گرداند ۱۴۰۵
+ یک بار یا بیشتر \d+ رشته‌ی رقم‌های پشت‌سرهم را کامل می‌گیرد
{9} دقیقاً نُه بار 09\d{9} همان الگوی شماره‌ی بالا
? صفر یا یک بار colou?r هم color را می‌گیرد هم colour
[abc] یکی از همین حروف [A-Za-z0-9._%+-] بخش اول الگوی ایمیل است
. هر کاراکتری به‌جز خط جدید a.c هم abc را می‌گیرد هم a c
^ و $ قفل به شروع و پایان ^\d{4} فقط وقتی متن با چهار رقم شروع شود

چه‌وقت سراغ regex نرویم؟

رجکس شکل را می‌بیند، ساختار را نه. این تفاوت وقتی گران می‌شود که متن ساختار داشته باشد؛ مثلاً HTML:

pythonimport re

html = "<p>پاراگراف اول</p><p>پاراگراف دوم</p>"
print(re.findall(r"<p>(.*)</p>", html))

خروجی:

['پاراگراف اول</p><p>پاراگراف دوم']

ستاره‌ی .* حریص است و تا آخرین بسته‌شدن تگ پیش می‌رود؛ دو پاراگراف در یک تطبیق بلعیده شدند. با .*? دو تکه‌ی تمیز برمی‌گردند، ولی این هنوز وصله است. برای HTML و JSON ابزار خودشان را بردار؛ الگو ساختار تودرتو را نمی‌فهمد.

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

الگوی regex را کجا سریع تست کنم؟

در تست رجکس آنلاین الگو می‌نویسی، متن می‌گذاری و تطبیق‌ها همان لحظه هایلایت می‌شوند. فلگ g همه‌ی تطبیق‌ها را می‌گیرد و فلگ i بزرگ و کوچکی حروف را بی‌اثر می‌کند. همه‌چیز داخل مرورگر اجرا می‌شود و هیچ ورودی‌ای جایی ذخیره نمی‌شود.

یک نکته‌ی کوچک هم بگویم که دیر یا زود گریبانت را می‌گیرد. \d در پایتون حتی ارقام فارسی مثل ۱۴۰۵ را هم می‌گیرد؛ خودم روی Python 3.13 آزمایشش کردم. جاوااسکریپت اما همان \d را فقط ارقام ۰ تا ۹ انگلیسی می‌شناسد. پس الگویی که برای فرم وب نوشته شده ممکن است در پایتون رفتار دیگری داشته باشد؛ هر الگو را با متن واقعی خودت بسنج، نه با نمونه‌ی کپی‌شده.

وقتی این اجزا برایت جا افتاد، دوره‌ی آموزش Regex از صفر همان‌ها را درس‌به‌درس با تمرین تعاملی جلو می‌برد؛ بیست درس است و کامل رایگان.

قدم بعدی روشن است. یک متن واقعی از کارت بردار و الگوی \d+ را رویش اجرا کن. از این به بعد هر الگویی که لازم شد را کپی نمی‌کنی؛ خودت می‌نویسی و در تستر می‌سنجی.

برچسب‌ها:#Regex#مبتدی
تحریریه‌ی دینا کد
نویسنده

نظرها

اولین نفری باشید که نظر می‌دهد
برای ثبت نظر وارد شوید

سؤالتان را بپرسید یا تجربه‌تان را بنویسید تا نویسنده‌ی مطلب پاسخ بدهد.

مطالب مرتبط

از همین دسته
مدیریت خطا با try و except در پایتون
آموزش

مدیریت خطا با try و except در پایتون

راهنمای گام‌به‌گام مهار خطاهای زمان اجرا در پایتون با بلوک‌های try و except همراه با بررسی خطاهای رایج و ساختار اصولی.

تحریریه‌ی دینا کد۵ دقیقه
مدیریت خطا در Rust با Result و Option
آموزش

مدیریت خطا در Rust با Result و Option

زبان Rust به جای ساختارهای سنتی استثنا از نوع‌های Result و Option برای مدیریت شفاف و پیش‌بینی‌پذیر خطاها در زمان کامپایل استفاده می‌کند.

تحریریه‌ی دینا کد۶ دقیقه
تفاوت واحدهای px و em و rem در CSS و کاربرد هرکدام
آموزش

تفاوت واحدهای px و em و rem در CSS و کاربرد هرکدام

واحدهای px، em و rem هرکدام برای بخش مشخصی از صفحه‌آرایی وب طراحی شده‌اند و انتخاب نادرست آن‌ها مقیاس‌پذیری و دسترسی‌پذیری سایت را مختل می‌کند.

تحریریه‌ی دینا کد۶ دقیقه