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