حسین کعبی: وقتی فیگو را در جام جهانی زدم....
برای تمامی این کارها راههای مختلفی وجود دارد: یک راه، جستجوی خط به خط برای پیدا کردن آدرسهای پست الکترونیکی موجود در یک متن است. یا برای فهم این که رشته متنی برابر آدرس ایمیل است یا خیر میتوانید آن را با جستجوی کاراکتر به کاراکتر انجام دهید و...، آیا راهحلهای ذکر شده، منطقی هستند؟ یک لحظه به این فکر کنید که چطور الگوریتمی ارائه دهید که بررسی کند آیا مقدار یک رشته، آدرس سایت هست یا خیر. درست است که این کار شدنی است ولی اولا با هزینه بسیار بالا انجام میشود و در ثانی الگوریتم ارائه شده نمیتواند جوابگوی تمامی شرایط باشد، بنابراین باید تمامی شرایط را در نظر بگیرید. با یک حساب سر انگشتی متوجه خواهید شد که این الگوریتم بسیار کندتر از آن چیزی که شما فکر میکنید، عمل میکند و از طرفی کامل هم نیست چون ممکن است شما همه شرایط را در نظر نگرفته باشید. این موضوع در جستجوی یک آدرس پست الکترونیکی در یک متن به اوج خود میرسد. پس راهحل چیست؟ راهی که بتوان با سرعت و اطمینان بالا کارهای ذکر شده را انجام داد.
جواب عبارات باقاعده (Regular Expression or RegEx) است. عبارت با قاعده را اگر بخواهیم به صورت کلی تعریف کنیم نشاندهنده یک سری قاعده کلی یا یک الگو برای یک یا چند رشته متنی است. عبارات با قاعده میتوانند شامل اسامی خاص، کلمات یا الگوهایی از پیش تعریف شده باشند. برنامههای پردازش متن برای جستجوی یک رشته در یک متن یا جایگزین کردن یک کلمه خاص، با یک سری کلمات دیگر از عبارات با قاعده استفاده میکنند. دلیل چنین کاری این است که استفاده از عبارات با قاعده هزینه زمانی کمتر و درصد خطای کمتری نسبت به روشهای دیگر دارد. روش عملکرد برنامههای پردازش متن این گونه است که شما یک الگو به آن میدهید و برنامه خودش به صورت اتوماتیک تمامی کلمات و عباراتی که با الگوی شما مطابقت دارند را بر میگرداند.
کاربرد عبارات باقاعده در برنامهنویسی
حال شما به عنوان برنامهنویس نیاز دارید بدانید که آیا مقداری که کاربر وارد کرده درست است یا خیر. یا مثلا شما برای دریافت اطلاعات یک سری قواعد خاص دارید که باید کاربر مقداری که وارد میکند با آن قواعد یکسان باشد؛ مثلا حتما در بخش پست الکترونیکی باید مقداری که نوشته شده برابر آدرس پست الکترونیکی باشد یا مثلا کلمه عبوری که وارد میکند هم شامل عدد باشد هم شامل حروف. برای این کار بیشتر زبانهای برنامهنویسی یک رابط برنامهنویسی ارائه میدهند که بتوان یک رشته را با یک عبارت باقاعده بررسی کرد.
چگونه یک عبارت باقاعده بنویسیم؟
برای این که بتوانید یک عبارت باقاعده بنویسید نیاز است که با یک سری علائم که هر کدام نشاندهنده یک چیز هستند آشنا شوید و سپس از کنار هم قرار دادن آنها یک عبارت باقاعده تولید کنید.
حال چند تا از این علائم را به اختصار در زیر توضیح میدهیم:
. : این نشانه یعنی هر رشته متنی که در آن خط جدید وجود نداشته باشد، یعنی رشته متنی که در یک خط نوشته شده باشد.
\w: هر کاراکتر یا مجموعه کاراکتری که شامل یک عدد یا حرف باشد.
\s:
\d: فقط عدد، اگر مثلا ورودی برابر a بود ورودی ما معتبر نیست و اگر مثلا برابر یک بود معتبر است.
\b: ابتدا و انتهای یک رشته متنی را مشخص میکند.
^: مشخص میکند در ابتدای رشته چه چیزی باید قرار بگیرد.
$: مانند ^ است با این تفاوت که برای انتهای رشته مورد استفاده قرار میگیرد.
*: نشاندهنده تکرار است و الزامی به تکرار شدن نیست یعنی میتواند در عبارت تکرار نشود.
+: نشاندهنده تکرار است با این تفاوت که حداقل یک بار تکرار شده باشد.
؟: یا یک بار یا هیچ وقت تکرار نشود.
{n}: یک عبارت حداقل و حداکثر n بار تکرار شده باشد.
{n,m}: یک عبارت حداقل به اندازه n و حداکثر به اندازه m تکرار شده باشد.
{,n}: حداقل به اندازه n تکرار شده باشد.
بعضی از موارد بالا دارای نقص هستند.
مثلا:
\W: عدد و حروف نباشد.
\S: دارای کاراکترهای whitespace نیست.
\D: عدد نباشد.
\B: هر موقعیتی بجز اول و آخر رشته متنی.
چند مثال:
\b\w{5,6}\b
پیدا کردن تمامی کلمههای ? و ? حرفی
\b\d{3}\s\d{3}-\d{4}
شماره تلفن ده رقمی
\d{3}-\d{2}-\d{4}
کد امنیتی بهصورت زیر
452-22-123*w\^
اولویت لغت در یک خط یا در کل متن
امیربهاءالدین سبطالشیخ
حسین کعبی: وقتی فیگو را در جام جهانی زدم....