نوشتن regex با هوش مصنوعی: سریع‌تر و بدون سردرد

الگوهای منظم یکی از آن چیزهایی‌اند که هر بار از نو باید یادشان بگیرید. حالا می‌شود توصیف کرد و الگو گرفت — به شرطی که بدانید خروجی را چطور بیازمایید.

🍊 تیم نارنگی ⏱ 5 دقیقه مطالعه
صفحه‌ی ویرایشگر کد با یک الگوی منظم و نتیجه‌ی تست آن روی نمونه‌های ورودی

هر برنامه‌نویسی این تجربه را دارد: یک الگوی منظم می‌نویسید، کار می‌کند، شش ماه بعد به آن برمی‌گردید و هیچ ایده‌ای ندارید که چه می‌کند. regex زبانی است که نوشتنش سخت‌تر از خواندنش نیست — خواندنش هم سخت است.

خبر خوب این است که این دقیقاً همان نوع کاری است که مدل‌های زبانی در آن قوی‌اند: ترجمه از یک توصیف انسانی به یک نحو فشرده و قاعده‌مند. خبر بدتر این است که خروجی‌شان اغلب تقریباً درست است، و در regex «تقریباً درست» یعنی باگی که ماه‌ها پیدا نمی‌شود.

پس تمرکز این راهنما روی دو چیز است: چطور توصیف کنید تا الگوی درست بگیرید، و چطور بفهمید الگویی که گرفته‌اید واقعاً درست است.

چرا این کار را خوب انجام می‌دهد

regex قواعد ثابت و مستندات فراوانی دارد و نمونه‌های زیادی از آن در متن‌های فنی موجود است. برخلاف کد پیچیده که نیاز به فهم معماری دارد، یک الگوی منظم واحد بسته و کوچکی است. برای همین کیفیت خروجی نسبت به بقیه‌ی کارهای برنامه‌نویسی — که در برنامه‌نویسی با هوش مصنوعی بررسی کرده‌ایم — بالاتر است.

ولی همین کوچکی، دام هم دارد: مدل الگویی می‌سازد که روی نمونه‌های شما جواب می‌دهد و شما فرض می‌کنید کامل است.

چطور توصیف کنید

سه چیز را همیشه بنویسید: زبان یا ابزار، نمونه‌هایی که باید مطابقت کنند، و نمونه‌هایی که نباید مطابقت کنند. آن مورد سوم بیشترین تأثیر را دارد و بیشتر از همه فراموش می‌شود.

یک regex برای PHP (استاندارد PCRE) بنویس که
شماره موبایل ایرانی را تشخیص بدهد.

باید بگیرد:
09123456789
+989123456789
00989123456789
0912 345 6789

نباید بگیرد:
0812345678
091234567890
9123456789 (بدون صفر یا کد کشور)
تلفن ثابت 02188776655

خروجی:
۱) خود الگو
۲) توضیح خط‌به‌خط هر بخش
۳) سه ورودی مرزی که ممکن است الگو اشتباه کند

بند سوم خروجی، مهم‌ترین بخش است. وقتی مدل را مجبور کنید علیه کار خودش فکر کند، معمولاً همان‌جا نقص‌ها را لو می‌دهد.

💡 قاعده‌ی نمونه‌ی منفی

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

آزمودن: بخشی که نباید رد شود

الگو را در ویرایشگر نچسبانید. اول در یک محیط تست بیندازید. regex101 هر بخش الگو را جدا توضیح می‌دهد و همان‌جا می‌بینید کدام قسمت چه کاری می‌کند. برای مرجع نحو هم راهنمای MDN دقیق و به‌روز است.

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

دام‌های متن فارسی

اینجا جایی است که خروجی‌های عمومی معمولاً می‌شکنند:

مشکلچه اتفاقی می‌افتدچه بگویید
ی و ک عربیکلمه‌های هم‌شکل رد می‌شوند«هر دو شکل ی و ک را پوشش بده»
نیم‌فاصلهکلمه‌ی مرکب نصف می‌شود«نیم‌فاصله را هم کاراکتر معتبر بگیر»
ارقام فارسیعدد فارسی تشخیص داده نمی‌شود«ارقام فارسی و لاتین هر دو»
اعراب و تشدیدمطابقت به‌هم می‌ریزد«اعراب اختیاری باشد»
فاصله‌ی بی‌شکستالگو بی‌دلیل رد می‌شودنمونه‌ی واقعی بدهید نه تایپ‌شده

نکته‌ی آخر مهم است: نمونه‌ها را از داده‌ی واقعی کپی کنید، نه اینکه خودتان تایپشان کنید. داده‌ی واقعی کاراکترهای نامرئی دارد که تایپ دستی ندارد.

وقتی الگو کار نمی‌کند

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

این الگو را دادی:
[الگو]

روی این ورودی درست کار نمی‌کند:
[ورودی دقیق]

انتظار: [چه باید می‌شد]
نتیجه‌ی واقعی: [چه شد]

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

کارایی و امنیت

الگوهایی با کوانتیفایرهای تودرتو می‌توانند روی ورودی خاص، زمان اجرا را به‌شدت بالا ببرند. اگر الگو روی ورودی کاربر اجرا می‌شود، این یک مسئله‌ی امنیتی است نه فقط کارایی. صریح بپرسید: «آیا این الگو در برابر بازگشت به عقب انفجاری آسیب‌پذیر است؟ اگر بله، نسخه‌ی امن‌تر بده.»

و یک سؤال که همیشه ارزش پرسیدن دارد: «آیا این کار بدون regex ساده‌تر نمی‌شود؟» گاهی جواب بله است و همان بهتر. اگر دارید داده از صفحه‌ی وب می‌کشید، معمولاً پارسر ساختاری از الگوی منظم مطمئن‌تر است — دلایلش در استخراج داده از سایت آمده.

مستندسازی الگو

الگوی بدون توضیح، بدهی فنی است. عادت خوب این است که همراه هر regex، یک کامنت دوخطی بگذارید: چه چیزی را می‌گیرد و چه چیزی را نمی‌گیرد. از مدل بخواهید همین را برایتان بنویسد؛ روش‌های کلی‌ترش در نوشتن مستندات فنی آمده.

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

جمع‌بندی

هوش مصنوعی نوشتن regex را از یک کار نیم‌ساعته به یک کار دوسه دقیقه‌ای تبدیل کرده. ولی بخش سخت regex هیچ‌وقت نوشتنش نبود؛ مطمئن شدن از درستی‌اش بود. آن بخش هنوز سر جای خودش است.

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

پرسش‌های پرتکرار

regex‌هایی که تولید می‌کند معمولاً درست‌اند؟ +
برای الگوهای رایج مثل ایمیل، شماره موبایل ایرانی یا تاریخ، اغلب درست‌اند. برای الگوهای پیچیده‌تر معمولاً چیزی می‌دهد که روی نمونه‌های شما کار می‌کند ولی موارد مرزی را رد می‌کند. هیچ الگویی را بدون تست روی داده‌ی واقعی وارد کد نکنید.
چرا باید بگویم کدام زبان یا ابزار؟ +
چون گویش‌های regex با هم فرق دارند. چیزی که در PCRE کار می‌کند ممکن است در جاوااسکریپت یا در grep پایه خطا بدهد. اگر زبان را ننویسید، مدل یکی را حدس می‌زند و شما با خطای عجیب روبه‌رو می‌شوید.
برای متن فارسی چه نکته‌ای هست؟ +
دو نکته. اول اینکه بازه‌ی حروف فارسی با عربی هم‌پوشانی دارد و باید کاراکترهایی مثل «ی» و «ک» را در هر دو شکل در نظر بگیرید. دوم اینکه نیم‌فاصله یک کاراکتر مستقل است و اگر لحاظش نکنید، کلمه‌های مرکب را از دست می‌دهید.
اگر regex کند شد چه کنم؟ +
کندی شدید معمولاً از بازگشت به عقب انفجاری می‌آید — حالتی که کوانتیفایرهای تودرتو روی ورودی نامتناسب، زمان اجرا را به‌شدت بالا می‌برند. الگو را با ورودی طولانی تست کنید و اگر مشکوک شدید، از مدل بخواهید نسخه‌ی بدون تودرتویی بدهد.
بهتر نیست به‌جای regex از تابع‌های رشته استفاده کنم؟ +
اغلب بله. اگر کاری با split یا contains حل می‌شود، همان خواناتر و سریع‌تر است. regex وقتی می‌ارزد که الگو واقعاً متغیر باشد. یک سؤال خوب از مدل این است: «آیا این کار بدون regex ساده‌تر نمی‌شود؟»
#نوشتن regex با هوش مصنوعی #عبارت منظم #regex فارسی #اعتبارسنجی ورودی #برنامه‌نویسی
به‌دردِ کسی می‌خورد؟ تلگرام واتساپ
🍊

خواندنش خوب بود — حالا امتحانش کن

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

بدونِ نصب هم کار می‌کند — ولی در اپ سریع‌تر است