نوشتن regex با هوش مصنوعی: سریعتر و بدون سردرد
الگوهای منظم یکی از آن چیزهاییاند که هر بار از نو باید یادشان بگیرید. حالا میشود توصیف کرد و الگو گرفت — به شرطی که بدانید خروجی را چطور بیازمایید.
هر برنامهنویسی این تجربه را دارد: یک الگوی منظم مینویسید، کار میکند، شش ماه بعد به آن برمیگردید و هیچ ایدهای ندارید که چه میکند. regex زبانی است که نوشتنش سختتر از خواندنش نیست — خواندنش هم سخت است.
خبر خوب این است که این دقیقاً همان نوع کاری است که مدلهای زبانی در آن قویاند: ترجمه از یک توصیف انسانی به یک نحو فشرده و قاعدهمند. خبر بدتر این است که خروجیشان اغلب تقریباً درست است، و در regex «تقریباً درست» یعنی باگی که ماهها پیدا نمیشود.
پس تمرکز این راهنما روی دو چیز است: چطور توصیف کنید تا الگوی درست بگیرید، و چطور بفهمید الگویی که گرفتهاید واقعاً درست است.
چرا این کار را خوب انجام میدهد
regex قواعد ثابت و مستندات فراوانی دارد و نمونههای زیادی از آن در متنهای فنی موجود است. برخلاف کد پیچیده که نیاز به فهم معماری دارد، یک الگوی منظم واحد بسته و کوچکی است. برای همین کیفیت خروجی نسبت به بقیهی کارهای برنامهنویسی — که در برنامهنویسی با هوش مصنوعی بررسی کردهایم — بالاتر است.
ولی همین کوچکی، دام هم دارد: مدل الگویی میسازد که روی نمونههای شما جواب میدهد و شما فرض میکنید کامل است.
چطور توصیف کنید
سه چیز را همیشه بنویسید: زبان یا ابزار، نمونههایی که باید مطابقت کنند، و نمونههایی که نباید مطابقت کنند. آن مورد سوم بیشترین تأثیر را دارد و بیشتر از همه فراموش میشود.
یک regex برای PHP (استاندارد PCRE) بنویس که
شماره موبایل ایرانی را تشخیص بدهد.
باید بگیرد:
09123456789
+989123456789
00989123456789
0912 345 6789
نباید بگیرد:
0812345678
091234567890
9123456789 (بدون صفر یا کد کشور)
تلفن ثابت 02188776655
خروجی:
۱) خود الگو
۲) توضیح خطبهخط هر بخش
۳) سه ورودی مرزی که ممکن است الگو اشتباه کند
بند سوم خروجی، مهمترین بخش است. وقتی مدل را مجبور کنید علیه کار خودش فکر کند، معمولاً همانجا نقصها را لو میدهد.
برای هر نمونهای که باید مطابقت کند، دستکم یک نمونه بنویسید که نباید. الگویی که فقط با نمونههای مثبت ساخته شده، تقریباً همیشه بازتر از چیزی است که میخواهید — و الگوی بیش از حد باز، بدترین نوع باگ است.
آزمودن: بخشی که نباید رد شود
الگو را در ویرایشگر نچسبانید. اول در یک محیط تست بیندازید. regex101 هر بخش الگو را جدا توضیح میدهد و همانجا میبینید کدام قسمت چه کاری میکند. برای مرجع نحو هم راهنمای MDN دقیق و بهروز است.
یک روش عملی: از مدل بخواهید همراه الگو، یک مجموعهی تست هم بنویسد. مثلاً ده رشتهی معتبر و ده رشتهی نامعتبر با انتظار مشخص. بعد آنها را اجرا کنید. این همان منطقی است که در هوش مصنوعی برای تست نرمافزار شرح دادهایم و اینجا با هزینهی خیلی کم اجرا میشود.
دامهای متن فارسی
اینجا جایی است که خروجیهای عمومی معمولاً میشکنند:
| مشکل | چه اتفاقی میافتد | چه بگویید |
|---|---|---|
| ی و ک عربی | کلمههای همشکل رد میشوند | «هر دو شکل ی و ک را پوشش بده» |
| نیمفاصله | کلمهی مرکب نصف میشود | «نیمفاصله را هم کاراکتر معتبر بگیر» |
| ارقام فارسی | عدد فارسی تشخیص داده نمیشود | «ارقام فارسی و لاتین هر دو» |
| اعراب و تشدید | مطابقت بههم میریزد | «اعراب اختیاری باشد» |
| فاصلهی بیشکست | الگو بیدلیل رد میشود | نمونهی واقعی بدهید نه تایپشده |
نکتهی آخر مهم است: نمونهها را از دادهی واقعی کپی کنید، نه اینکه خودتان تایپشان کنید. دادهی واقعی کاراکترهای نامرئی دارد که تایپ دستی ندارد.
وقتی الگو کار نمیکند
بهجای درخواست الگوی جدید، مورد شکست را بدهید. این کار سریعتر به نتیجه میرسد چون مدل زمینه را دارد:
این الگو را دادی:
[الگو]
روی این ورودی درست کار نمیکند:
[ورودی دقیق]
انتظار: [چه باید میشد]
نتیجهی واقعی: [چه شد]
فقط همان بخشی را که مشکل دارد اصلاح کن و بگو
دقیقاً چه چیزی را عوض کردی. کل الگو را از نو ننویس.
کارایی و امنیت
الگوهایی با کوانتیفایرهای تودرتو میتوانند روی ورودی خاص، زمان اجرا را بهشدت بالا ببرند. اگر الگو روی ورودی کاربر اجرا میشود، این یک مسئلهی امنیتی است نه فقط کارایی. صریح بپرسید: «آیا این الگو در برابر بازگشت به عقب انفجاری آسیبپذیر است؟ اگر بله، نسخهی امنتر بده.»
و یک سؤال که همیشه ارزش پرسیدن دارد: «آیا این کار بدون regex سادهتر نمیشود؟» گاهی جواب بله است و همان بهتر. اگر دارید داده از صفحهی وب میکشید، معمولاً پارسر ساختاری از الگوی منظم مطمئنتر است — دلایلش در استخراج داده از سایت آمده.
مستندسازی الگو
الگوی بدون توضیح، بدهی فنی است. عادت خوب این است که همراه هر regex، یک کامنت دوخطی بگذارید: چه چیزی را میگیرد و چه چیزی را نمیگیرد. از مدل بخواهید همین را برایتان بنویسد؛ روشهای کلیترش در نوشتن مستندات فنی آمده.
میتوانید هر سه مرحله — نوشتن، تست و مستندسازی — را در یک گفتوگو در نارنگی جلو ببرید تا زمینه از دست نرود.
جمعبندی
هوش مصنوعی نوشتن regex را از یک کار نیمساعته به یک کار دوسه دقیقهای تبدیل کرده. ولی بخش سخت regex هیچوقت نوشتنش نبود؛ مطمئن شدن از درستیاش بود. آن بخش هنوز سر جای خودش است.
پس معامله را طوری ببندید که به نفعتان باشد: وقتی که در نوشتن صرفهجویی کردید را خرج تست کنید. نمونهی منفی بنویسید، مورد مرزی بخواهید، و الگو را قبل از رفتن به کد، جایی اجرا کنید که بتوانید ببینید چه میکند.