بیشتر برنامهنویسان یک نقطه کور دارند. آنها با خوشحالی یک سیستم توزیعشده را دیباگ میکنند یا با یک فریمورک جدید دستوپنجه نرم میکنند، اما بیست دقیقه را صرف یک ویرایش متنی دستی میکنند که باید ده ثانیه طول میکشید. دلیل آن همیشه یکسان است: عبارتهای منظم (regex) شبیه به نویز خط به نظر میرسند. یک الگوی معمولی، دیواری از اسلشها، بکاسلشها و علائم نگارشی است که انگار از یک مودم دهه ۱۹۹۰ ارسال شده است. این آشفتگی بصری، افراد توانمند را از یادگیری یک مهارت واقعاً ارزشمند فراری میدهد.
خبر خوب این است که regex دشوار نیست؛ بلکه متراکم است. نمادها مقدار عظیمی از معنا را در فضای کمی جای میدهند، بنابراین چشم شما در جایی که در واقع یک توصیف بسیار دقیق وجود دارد، تصادف میبیند. وقتی مدل ذهنی درستی پیدا کنید، دیگر سعی نمیکنید نمادها را یکییکی رمزگشایی کنید، بلکه شکلی را که توصیف میکنند میخوانید. وقتی این کار را انجام دهید، آن نویزها کاملاً از بین میروند.
یک الگو، نه یک برنامه
تغییر بنیادین در درک این است که یک عبارت منظم واقعاً چیست. بیشتر کدهایی که مینویسید رویهای (procedural) هستند: این کار را انجام بده، سپس آن کار را انجام بده، این شرط را بررسی کن، دوباره حلقه بزن. اما regex یک رویه نیست. regex یک الگوی ایستا است که توصیف میکند متن باید چگونه باشد. شما دستورالعملهایی برای نحوه جستجو نمینویسید؛ بلکه یک طرح اولیه به موتور تطبیق میدهید و اجازه میدهید کار را خودش انجام دهد.
آن را مانند توصیف اشکال به زبان انگلیسی ساده در نظر بگیرید:
- یک عدد پنجرقمی.
- یک آدرس ایمیل.
- خطی که با یک حرف بزرگ شروع میشود.
regex فقط همین کار را انجام میدهد، با این تفاوت که از یک الفبای فشرده استفاده میکند. وقتی \d{5} را میبینید، جادو نمیبینید؛ بلکه میبینید: «یک رقم، پنج بار». وقتی ^[A-Z] را میبینید، میبینید: «شروع یک خط، که با یک حرف بزرگ دنبال میشود». مهارت در حفظ کردن نیست؛ بلکه یادگیری این است که به الگو نگاهی گذرا بیندازید و آن را به همان توصیف انگلیسی ساده برگردانید. وقتی بتوانید این ترجمه را انجام دهید، عامل ترس و دلهره از بین میرود.
زمان واقعاً کجا صرف میشود
مردم معمولاً تنها زمانی regex را یاد میگیرند که به اندازه کافی رنج کشیده باشند. رویکرد بهتر این است که قبل از اینکه یک بعدازظهر را برای آنها تلف کنید، کارهایی را که نیاز به الگو دارند شناسایی کنید.
اگر نیاز دارید هر تاریخ موجود در یک سند دویست صفحهای را پیدا کنید، یک regex آنها را در یک مرحله پیدا میکند. اگر نیاز دارید قبل از اینکه اپلیکیشن شما آن را بپذیرد، تأیید کنید که آیا کاربر یک URL واقعی تایپ کرده است یا خیر، یک الگو میتواند شکل پایه آدرس را اعمال کند. اگر در حال پاکسازی متنی هستید که از یک وبسایت کپی شده و نیاز دارید چندین فاصله را به یک فاصله تبدیل کنید، یک regex جایگزین فقط چهار کاراکتر نیاز دارد. اگر در حال استخراج داده از لاگهای نامنظم سرور هستید، regex اغلب تنها پل منطقی بین متن بدون ساختار و یک گزارش ساختاریافته است.
اینجا یک قانون ساده برای اجرا وجود دارد: اگر قرار است یک ویرایش متنی را پنجاه بار به صورت دستی انجام دهید، متوقف شوید. در عوض، یک الگو بنویسید. تکرار دستی نه تنها کند است، بلکه غیرقابل اعتماد هم هست. شما ممکن است مورد چهل و هفتم را از قلم بیندازید یا در مورد سی و سوم یک غلط تایپی وارد کنید. یک الگو کار را یک بار، به درستی انجام میدهد و قانونی را که در ابتدا اعمال میکردید، مستند میکند.
یک چرخه یادگیری که کار میکند
سعی نکنید الگوهای بینقص را از حفظ تایپ کنید. این همان روشی است که باعث ایجاد ناامیدی میشود. در عوض، از یک چرخه فشرده پیروی کنید که بدون گم شدن در نحو (syntax)، شما را به جلو میراند.
- شکل را با کلمات توصیف کنید. قبل از اینکه به یک کاراکتر خاص دست بزنید، دقیقاً آنچه را که میخواهید بنویسید. «چهار رقم، سپس یک خط تیره، سپس دو رقم، سپس یک خط تیره، و سپس دو رقم». اگر نمیتوانید آن را به وضوح بیان کنید، نمیتوانید برای آن الگو بنویسید.
- یک پیشنویس اولیه ایجاد کنید. با استفاده از گستردهترین نمادهای منطقی، توصیف خود را به یک الگوی پایه تبدیل کنید. نگران بینقص بودن نباشید. شما در حال ساخت یک نمونه اولیه هستید،
