آموزش سریع عبارت‌های باقاعده (regular expression)

روزی دوست خوبم آقای نبی کرمعلی زاده سناریویی مطرح کرد که لازم بود دو خط از یک فایل متنی با یک الگوی خاص تطبیق داده می‌شد. در نگاه اول مشخص بود که باید از ابزار sed، پرل یا awk استفاده کرد ولی در واقع همه‌ی این ابزارها با کمک یک موجودیت قادر به انجام دادن کار بودند: regular expression

پس از کمی جستجو در اینترنت متوجه شدم که هیچ راهنمای فارسی برای regular expression (که من فارسی آن را «عبارت‌ باقاعده» ترجمه کردم) وجود ندارد*. پس تصمیم گرفتم آنچه یاد می‌گیرم برای کمک به مخاطبانی که ممکن است به آن نیاز پیدا کنند بنویسم. مقاله‌ای که در اینجا عرضه می‌شود، حاصل این تلاش من است. لطفا در صورتیکه در مطالعه‌ی این مقاله به اشکال یا ایرادی نگارشی یا غلط تایپی برخورد کردید، به من اطلاع دهید تا ضمن اضافه شدن اسمتان در بخش مشارکت‌کنندگان به بهبود این اثر کمکی شده باشد.

*- البته بعد از خاتمه‌ی نگارش این مقاله متوجه شدم که کتابی در این زمینه قبلا نوشته شده است.

————————————

نسخه‌ی ۱.۱ این راهنما پس از ویرایش نسخه‌ی ۱.۰ برای دانلود آماده است؛

حجم: ۱۹۵.۷ کیلوبایت

quick regular expression guide Persian (farsi) language

"29655" مرتبه دانلود شده

Thanks for passing by: ↓



27 دیدگاه برای “آموزش سریع عبارت‌های باقاعده (regular expression)”

  1. سلام
    فقط دانلود کردم که ببینم چی نوشتی
    آخه کل نت رو بگردی یک مقاله درست در این مورد نیست منم می خواهم یک مقاله کلی در این مورد بنویسم آخه کمی یادگیریش به نظرم سخته و همه باهاش مشکل دارن ولی وقتی یاد بگیری باهاش حال میکنی
    مرسی موفق باشی

    [پاسخ]

    ali پاسخ در تاريخ آذر ۱۸ام, ۱۳۸۹ ۴:۵۷ ب.ظ:

    سلام جواد جان؛
    خوشحالم که دانلود کردی. البته این مقاله آموزش کلی نیست و بیشتر برای اینکه مخاطب بتونه کار رو شروع کنه (و اصطلاحا ترسش بریزه!!) نوشته شده. در مورد اینکه «همه باهاش مشکل دارن ولی وقتی یاد بگیری باهاش حال می‌کنی» کاملا باهات موافقم.
    🙂
    این مقاله غلط و اشتباه زیاد داره، هر چند تا حالا کسی چیزی در موردشون به من نگفته!!
    به هر حال امیدوارم من رو از انتقادات و پیشنهادات خودت محروم نکنی.
    در مورد مقاله‌ی خودت هم اگه کمکی نیاز داشتی من در خدمتم.
    یا علی

    [پاسخ]

  2. سلام٬ مقاله خوبی بود در ضمن غلط املایی نداشت اما ویرایشی شاید(:دی) . قبلا یه سه واحدی در موردش مطالعه کرده بودم (نظریه زبانها-اتوماتها) اما این مقاله به نظرم کامل و خوب بود.
    مرسی.
    در ضمن اون لینکی(؟) که گفته بودی به ویکی اضافه کنم ٬ شرمنده نتونستم توی ویکی عضو بشم. علی الحساب همون جا باشه فعلا تا بعدا یکاریش می کنم.

    ممنون از مقاله ای که نوشتی.

    [پاسخ]

  3. راستیتش قبلن من یه پست در این مورد توی وبلاگم داشتم :
    http://saarblog.wordpress.com/2010/03/04/regular-expression

    ولی خب چیزی که باعث شد بیام و نظر بنویسم، آرایش فایل PDF بود. حیف نیست تو که داری یه مطلب خوب می‌نویسی یه سری نکات ساده مثل من چه می‌دونم به نوع قلم و حتی اعداد غیر فارسی رو توجه نمی‌کنی؟ اگر خواستی فایل سورس رو به من بده تا پورتش کنم به لاتک.

    [پاسخ]

    ali پاسخ در تاريخ اسفند ۲۰ام, ۱۳۸۹ ۱۰:۱۳ ب.ظ:

    والله رامین جان نمی‌دونم! اصلا سورسش رو برات ایمیل می‌کنم. 🙂

    [پاسخ]

  4. مرسی. امیدوارم محتوای با ارزشی داشته باشه. منم از اون دسته افرادم که مشکل و ترس زیادی با عبارات باقائده دارم ! 🙁

    [پاسخ]

    ali پاسخ در تاريخ اردیبهشت ۲۳ام, ۱۳۹۰ ۱۰:۵۳ ب.ظ:

    بی‌صبرانه منتظر بازخوردت هستم علیرضا جان. 😉

    [پاسخ]

  5. سلام…

    میشه راهنمایی کنی اگر خواسته باشیم در متن عربی اعراب دار جستجو کنیم با این روش چطوری باید استفاده کنیم

    مثلا باید این اعراب (َ ِ ُ ً ٍ ٌ ّ ) رو نادیده بگیره
    و این کلمات رو یکی پنداره (آأإ)=ا و (ی ی ئ)= ی

    [پاسخ]

    ali پاسخ در تاريخ اردیبهشت ۲۵ام, ۱۳۹۰ ۱۰:۴۸ ب.ظ:

    موضوع جالبی رو مطرح کردی حسین جان، توی این پست درموردش نوشتم، اگه سوالی بود در خدمتم.

    [پاسخ]

  6. با سلام خیلی ممنون !

    ولی من خود راهشو پیدا کردم …

    مثلا برای جستجوی اعملوا در جمله اعراب دار چنین مینویسیم :

    \b(آ|أ|إ|ا)(ّ|َ|ِ|ُ|ً|ٍ|ٌ|ْ)*ع(ّ|َ|ِ|ُ|ً|ٍ|ٌ|ْ)*م(ّ|َ|ِ|ُ|ً|ٍ|ٌ|ْ)*ل(ّ|َ|ِ|ُ|ً|ٍ|ٌ|ْ)*(و|ؤ)(ّ|َ|ِ|ُ|ً|ٍ|ٌ|ْ)*(آ|أ|إ|ا)(ّ|َ|ِ|ُ|ً|ٍ|ٌ|ْ)*\b

    [پاسخ]

    ali پاسخ در تاريخ اردیبهشت ۲۶ام, ۱۳۹۰ ۶:۳۸ ب.ظ:

    خوشحالم که پیداش کردی. ولی من نمی‌تونم از این روش توی ترمینال لینوکس استفاده کنم. این بود که اون پست رو زدم. احتمالا از عبارات باقاعده در زبان/محیطی استفاده کردی که یونیکد رو پشتیبانی می‌کنه.
    به هر حال، تبریک می‌گم 🙂

    [پاسخ]

  7. با سلام خیلی ممنون از توجهت !!

    یه سوال دیگه اگه خواسته باشیم جستجوی ترکیبی داشته باشیم به صورتیکه دقت ترتیب کلمه نداشته باشه کدی که حساس به ترتیب باشه این هست :

    \bali\b.+\bhasan\b

    که این رو پیدا میکنه

    ali va hasan amadan

    اما اگر اینطور بنویسیم پیدا نمیکنه :

    \bhasan\b.+\bali\b

    حالا چطوری میشنه نوشت که در هر دو حالت عبارت رو پیدا کنه ؟

    [پاسخ]

    ali پاسخ در تاريخ اردیبهشت ۲۷ام, ۱۳۹۰ ۶:۱۱ ب.ظ:

    سلام؛
    حسین جان، نمی‌دونم توی چه محیطی داری از عبارات باقاعده استفاده می‌کنی و اگه گفته بودی شاید بهتر می‌تونستم کمک کنم.
    به نظرم این جستجوی ترکیبی رو با یک حالت «یا» می‌شه پیاده سازی کرد. به این تفسیر که یا «حسن و علی» در متن پیدا می‌شه یا «علی و حسن» بنابراین شما با مطرح کردن هر دو حالت: استفاده از یک | بین دو قطعه الگو می‌تونین الگوی نهایی که شامل هر دو حالت باشه رو بسازین.
    متاسفانه چون نمی‌دونم از چه محیطی دارین استفاده می‌کنین نمی‌تونم الگوی نهاییش رو بنویسم. امیدوارم این توضیحات کافی بوده باشه.

    [پاسخ]

  8. خیلی ممنون

    منظورت رو گرفتم یعنی اینطوری میشه

    \b(hasan|ali)\b.+\b(ali|hasan)\b

    ولی راستش اینطور یه خورده کارومشکل میکنه ..میخواستم بدونم راهی غیر از این هست که مثلا مستقیما خودش بتونه اینکارو بکنه ..

    راستی یک برنامه کوچیک نوشتم که بشه باهاش کد های regular expression رو تست کرد و با سیستمی که من استفاده میکنم سازگاره .البته برا ویندوزه تو لینوکس هم با wine کار میکنه

    در ضمن بر کسایی که لینوکس ندارن خوبه و میتونن ازش استفاده کنن !
    این هم لینک دانلودش :
    http://regularexpression.persiangig.com/RegularExpression.zip
    برنامش رایگان به شرط صلوات !!

    [پاسخ]

  9. اصلا بذار با مثال های مخلتف بیش بریم ..
    الف.جایی که علی و حسن در هرجای متن باشه(بدون لحاظ تقدم و تاخر) که مثالش این میشه :
    \b(علی|حسن)\b.+\b(حسن|علی)\b
    ب.جایی که علی و حسن باشه با لحاظ تقدم و تاخر که مثالش این میشه :
    \b(علی)\b.+\b(حسن)\b
    ج.جایی که علی باشه اما بهروز نباشه
    د.جایی که علی و حسن باشه اما رستم و بهروز نباشه
    ه.جایی که علی و حسن باشه اما رستم و بهروز نباشه یا اینکه مریم و مینا باشه

    سه مورد اخرو نمیدونم باید چیکار کنم
    بیزحمت با اون برنامه که گذاشتم تستش کن و راهنماییم کن !

    [پاسخ]

    ali پاسخ در تاريخ اردیبهشت ۲۸ام, ۱۳۹۰ ۱۲:۴۴ ب.ظ:

    حسین جان، برنامه‌ای که شما با qt نوشتین رو دیدم. برنامه‌ی ساده و خوبی هستش، ولی با واین اجرا نمی‌شه! (حداقل برای من که فقط نوار عنوان رو نمایش داد)
    در مورد مثال‌هایی که نوشتی الگویی نهایشون مشکلی نداره با کمی دقت و حوصله و با اصولی که توی راهنما مطرح شده به راحتی می‌تونی بنویسیش. (بخش دوم راهنما رو مطالعه کن)
    مسئله‌ای که وجود داره (همونطور که توی بخش دوم راهنما گفتم) این هستش که نرم افزارهایی که با عبارت‌های باقاعده درگیر هستن پیاده‌سازی‌های متفاوتی از استاندارد POSIX داشتن/دارن و همین امر باعث بوجود آمدن تفاوت‌هایی در تفسیر الگوها می‌شه.
    پس اگه احساس کردی الگویی منطقا صحیح هستش ولی در عمل جواب نمی‌ده به مستندات زبانی که با اون کد می‌نویسی (در اینجا qt) رجوع کن و موضوع رو از اونجا بررسی کن.

    [پاسخ]

  10. ْسلام
    با تشکر از راهنمایی خوب شما در مورد این موضوع (Reg Exp)
    واقعا منبع خوبی بود. چون خود این مفهوم در ابتدا یه کم فهمیدنش مشکله . دیگه چه برسه به اینکه منبع فارسی هم نباشه.

    [پاسخ]

    ali پاسخ در تاريخ تیر ۲۱ام, ۱۳۹۰ ۶:۰۴ ب.ظ:

    خواهش می‌کنم مهدی جان، خوشحالم که استفاده کردین. 🙂

    [پاسخ]

  11. سلام،
    اول عذر میخوام که چرا زودتر اینجا پست ندادم و تشکر نکردم.
    واقعاً سند ارزشمندی بود دستت درد نکنه علی جان.
    فقط من هر چی گشتم چیزی درمورد عملگر آکولاد {} و مشخص کردن حداقل و حداکثر وجود یک عبارت در این راهنما پیدا نکردم. شاید من با دقت نگاه نکردم.
    بازم ممنون.

    [پاسخ]

    ali پاسخ در تاريخ مرداد ۲۳ام, ۱۳۹۰ ۱۲:۰۹ ق.ظ:

    قربونت برم نبی جون، کامنت نداده هم عزیزی.
    کروشه‌ها هستن. توی بخش دوم مقاله، توی جدول در موردشون صحبت شده. 😉

    [پاسخ]

    نبی پاسخ در تاريخ مرداد ۲۹ام, ۱۳۹۰ ۶:۳۰ ق.ظ:

    بله الان دیدمش. ببخشید دقت نکردم.
    این دو حالت هم هست که بهش اشاره ای نکرده بودی:
    a{3}‎ به aaa اشاره میکند. (دقیقاً ۳ کارکتر)
    a{3,}‎ به aaa و aaaa و aaaaa و … اشاره میکند. (حداقل ۳ کارکتر)

    [پاسخ]

    ali پاسخ در تاريخ شهریور ۲ام, ۱۳۹۰ ۲:۲۴ ب.ظ:

    مررسی نبی جون، توی نسخه‌ی بعدی لحاظش می‌کنم. 😉

  12. عزیز اگه دوست داشتی میتونی سورس این مقاله رو بدی تا با لاتک (LaTex) مرتبش کنم و یه PDF درست و درمون بهت بدم..

    [پاسخ]

    ali پاسخ در تاريخ مرداد ۶ام, ۱۳۹۱ ۹:۱۲ ق.ظ:

    ساسان جان ایمیلی، چیزی! به کجا بفرستم سورس رو؟ 🙂

    [پاسخ]

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *