ایجاد: ۱۲:۵۵ ۱۳۹۱/۸/۱۴
ویرایش: ۱۹:۵۱ ۱۳۹۷/۲/۲۱
»
گاهی ما میخواهیم کلمه خاصی (مثلا ali) را در یک متن پیدا کنیم. یا میخواهیم کلمه خاصی را در یک متن با کلمه دیگری جایگزین کنیم (مثلا بجای تمام کلمات ali از reza استفاده کنیم)، خب این کار به سادگی با گزینههای find و replace میسر است. اما اگر هدف شما از یافتن یا جایگزینی، نه یک کلمه مشخص بلکه یک ساختار منطقی باشد (مثلا تمام شمارههای 11 رقمی که با 0912 شروع میشوند) در این صورت چاره کار چیست؟
«عبارات با قاعده» یا همان regular expression (که گاهی اختصارا Regex
گفته میشود) در زبانهای مرسوم برنامهنویسی وجود دارند و علاوه بر محیط برنامهنویسی، در برخی ویرایشگرهای متنی (مثل ++Notepad یا EmEditor و ...) نیز امکان آن تعبیه شده است.
در ریجکس، لازم است یک الگو (pattern) تعریف شود که جستجو شود. در الگو برخی حرفها (کاراکترها) معنای خاصی دارند. مثلا کاراکتر خط تیره را در الگوی زیر در نظر بگیرید:
[2-7]
این الگو بر یک عدد یک رقمی بین 2 تا 7 منطبق میشود.
پس نوشتن الگو کار سختی نیست فقط باید کاراکترهای معنادار را بلد باشیم و همچنین اگر جایی واقعا به دنبال یک کاراکتر بودیم که از قضا در ریجکس معنادار هم بود (مثلا واقعا به دنبال خط تیره بودیم) قبل از آن کاراکتر یک بکاسلش قرار دهیم تا الگوی صحیحی داشته باشیم.
برخی کاراکترهای معنادار در عبارات با قاعده
[ ]
براکت
درون براکت میتوان هر تعداد کاراکتر دلخواه قرار داد اما حواسمان باید که هر براکت فقط به یکی از حرفهای درون آن منطبق میشود.
[2-7c-fxwyztuR-X#%]
پس براکت فوق فقط به یکی از ارقام یا حروف یا علائم مورد اشاره (234567cdefxwyztuRSTUVWX#%) منطبق میشود و لا غیر!
.
نقطه
نقطه به هر کاراکتری منطبق میشود!
+
و
*
علامت جمع و ضرب
شبیه هم هستند. زمانی که جلوی یک براکت یا گروه پرانتزی (که خواهیم گفت) بیایند، به معنای امکان تکرار آن خواهد بود. منتها + به معنای حداقل یکبار تکرار و * به معنای حداقل صفر بار!
09[123][0-9]+
الگوی فوق دنبال عددی میگردد که با 091 یا 092 یا 093 شروع شود و در ادامه آن تعدادی رقم ذکر شود.
?
علامت سوال
برای اعلام اختیاری بودن یک کاراکتر یا گروه است. مثلا الگوی زیر وجود داشتن یا نداشتن صفر در ابتدای عدد را اختیاری اعلام میکند:
0?9[123][0-9]+
{ }
کروشه یا آکولاد!
برخلاف قبلی که تعداد تکرار مشخص نبود، با استفاده از کروشه میتوان تعداد تکرار یک گروه (کاراکتری یا کلمهای) را مشخص کرد. مثلا:
09[123][0-9]{8}
0[0-9]{5,8}
0[0-9]{5,}
0[0-9]{,8}
همانطور که میبینید، درون کروشه میتواند دقیقا یک عدد بیاید یا محدودهای را مشخص کند یا فقط حداقل یا فقط حداکثر تعداد تکرار را مشخص کند.
\d
و
\w
و
\s
و
\t
و
\r
و
\n
و ...
هر یک از این کاراکترها به معنای خاصی هستند. اولی به معنای یک digit یا یک رقم است. یعنی 0 تا 9. دومی به معنای یک حرف از یک word است و سومی به معنای اسپیس. چهارمی به معنای tab و پنجمی و ششمی هم کاراکترهای مربوط به انتهای خط و رفتن به خط بعد هستند.
( )
پرانتز
پرانتزها برای گروهبندی به کار میروند و در موقع جایگزینی (replace) اهمیتشان ظاهر میگردد چرا که میتوان یک الگو را با پرانتز به چند گروه زیرالگو تقسیم کرد و با هر زیرالگو کار خاصی انجام داد.
منابعی جهت مطالعه بیشتر
در مورد regex سایتها، ابزارها، راهنماها و حتی کتب مستقلی نوشته شده است که میتواند راهنمای خوبی برای «شروع» باشد چرا که برای نوشتن الگوی ریجکس، فقط دانستن نحوه الگونویسی نیست که به شما کمک میکند بلکه اطلاع از تمام حالات عبارت مدنظر و همچنین «تمرین و تجربه» نقش مهمی را ایفا میکند.
سایت
regular-expressions.info یکی از سایتهایی است که این مبحث را از حد ساده تا حد پیشرفته آموزش داده است که در ادامه آموزش مقدماتی فوق، شما را به دیدن آن دعوت میکنم.
همچنین در
عبارات منطقی و با قاعده - پیشرفته سرویسهایی معرفی کردم که با کمک آن میتوانید به صورت آنلاین به تمرین نوشتن الگوهای regex بپردازید.
در صورتی که برنامهنویس php هستید نیز میتوانید با مراجعه به راهنمای آنلاین این زبان، با
توابع پرکاربرد آن برای کار با عبارات باقاعده آشنا شوید.
اگر برنامهنویس جاوا اسکریپت هستید نیز
این راهنمای خوب را از دست ندهید.
یادداشتهای مرتبط
- عبارات منطقی و با قاعده - پیشرفته
- نمایش و جایگزینی ارقام متون سایت به صورت فارسی یا عربی بجای انگلیسی
- افزودن جستجوی سایت شما به براوزر کاربر
- ایجاد تصاویر بکگراند