موضوع مقاله: عبارت باقاعده | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # عبارت باقاعده | مقدمه: معمولاً این الگوها توسط الگوریتم‌های جستجوی رشته برای عملیات «یافتن» یا «یافتن و جایگزینی» روی رشته‌ها یا برای اعتبارسنجی داده‌های ورودی بهره گرفته می‌شوند. | ## بخش 1: عبارت باقاعده | مفهوم عبارات باقاعده در دهه ۱۹۵۰ میلادی (۱۳۳۰ شمسی) آغاز شد، آنگاه که ریاضیدان آمریکایی استیون کول کلینی مفهوم زبان منظم را به‌صورت رسمی تعریف کرد. از دهه ۱۹۸۰ (۱۳۶۰ شمسی) نحوهای گوناگونی برای نوشتن عبارات باقاعده وجود داشته‌اند؛ یکی از آن‌ها استاندارد پازیکس و دیگری که به‌طور گسترده بهره گرفته می‌شود، نحو پرل است. عبارات باقاعده در موتورهای جستجو، در گفتگوهای جستجو و جایگزینی واژه‌پردازها و ویرایشگرهای نوشتار، در ابزارهای پردازش نوشتار مانند Sed و AWK و در تحلیل واژگانی بهره گرفته می‌شوند. پیاده‌سازی‌های کتابخانه‌ای اغلب «موتور» نامیده می‌شوند و بسیاری از آن‌ها برای بهره‌گیری مجدد در دسترس هستند. این مفاهیم در علوم نظری رایانه، در زیرشاخه‌های نظریه ماشین‌ها (مدل‌های محاسبات) و توصیف و طبقه‌بندی زبان‌های صوری پدیدار شدند و برانگیخته از تلاش کلینی برای توصیف شبکه‌های عصبی مصنوعی اولیه بودند. (کلینی آن را به‌عنوان جایگزینی برای اصطلاح «prehensible» مک‌کالوک و پیتس معرفی کرد، اما اذعان داشت «از هرگونه پیشنهادی برای اصطلاحی توصیفی‌تر استقبال می‌کنیم.»Kleene 1951, pg46) از دیگر پیاده‌سازی‌های اولیه تطبیق الگو می‌توان به زبان اشاره کرد که از عبارت‌های باقاعده بهره نمی‌گرفت، بلکه ساختارهای تطبیق الگوی خود را داشت. عبارت‌های باقاعده از سال ۱۹۶۸ در دو کاربرد متداول شدند: تطبیق الگو در ویرایشگر نوشتار و تحلیل واژگانی در کامپایلر. از نخستین نمونه‌های به‌کارگیری عبارت‌های باقاعده در قالب برنامه، هنگامی بود که کن تامسون نمادگذاری کلینی را در ویرایشگر جای داد تا الگوها را در پرونده‌های نوشتاری بیابد. برای افزایش سرعت، تامپسون تطبیق عبارت‌های باقاعده را با کامپایل درجا به کد بر روی سیستم اشتراک زمانی سازگار پیاده‌سازی کرد که نمونه‌ای مهم و اولیه از کامپایل درجا به‌شمار می‌آید. او بعدها این قابلیت را به ویرایشگر یونیکس ed افزود که سرانجام به بهره‌گیری ابزار جستجوی پرکاربرد گرپ از عبارت‌های باقاعده انجامید («grep» واژه‌ای است برگرفته از دستور جستجو با عبارت باقاعده در ویرایشگر ed: g/re/p به معنای «جستجوی سراسری برای عبارت باقاعده و چاپ خطوط مطابق»). تقریباً همزمان با توسعه QED توسط تامپسون، گروهی از پژوهشگران از جمله ابزاری مبتنی بر عبارت‌های باقاعده را برای تحلیل واژگانی در طراحی کامپایلر پیاده‌سازی کردند. گونه‌های بسیاری از این شکل‌های اولیه عبارت‌های باقاعده در برنامه‌های یونیکس در آزمایشگاه‌های بل در دهه ۱۹۷۰ مورد کاربرد قرار گرفتند؛ از جمله لکس، Sed, AWK و ، و همچنین در برنامه‌هایی مانند وی‌آی و ایمکس (که نحو و رفتار خاص و ناسازگار خود را دارد). سپس regexها در طیف گسترده‌ای از برنامه‌ها پذیرفته شدند و این شکل‌های اولیه در استاندارد POSIX.2 در سال ۱۹۹۲ استانداردسازی گردیدند. پروژه‌های نرم‌افزاری که پیاده‌سازی عبارت باقاعده Tcl اسپنسر را پذیرفته‌اند شامل پستگرس‌کیوال می‌شوند. پرل بعدها کتابخانه اصلی اسپنسر را گسترش داد و ویژگی‌های بسیار جدیدی به آن افزود. حاصل این تلاش یک زبان کوچک به نام است که برای تعریف دستور زبان Raku و همچنین فراهم‌آوری ابزاری برای برنامه‌نویسان این زبان بهره‌گیری می‌شود. این قوانین ویژگی‌های موجود regexهای Perl 5.x را حفظ می‌کنند، اما همچنین تعریف به سبک BNF از یک تجزیه‌کننده کاهشی بازگشتی از طریق زیرقوانین را نیز امکان‌پذیر می‌سازند. کاربرد regexها در استانداردهای اطلاعات ساختاریافته برای مدل‌سازی سند و پایگاه داده از دهه ۱۹۶۰ آغاز شد و در دهه ۱۹۸۰ هنگامی که استانداردهای صنعتی مانند ISO SGML (که پیشتر توسط ANSI به صورت «GCA 101-1983» پایه‌گذاری شده بود) تثبیت شدند، گسترش یافت. پیش از کاربرد عبارت‌های باقاعده، بسیاری از زبان‌های جستجو از جایگزین‌های ساده بهره می‌بردند؛ برای نمونه «*» برای تطبیق با هر دنباله‌ای از نویسه‌ها و «?» برای تطبیق با یک نویسه واحد. نشانه‌هایی از این رویکرد هنوز در نحو گلوب (برنامه‌نویسی) برای نام پرونده‌ها و در عملگر LIKE در اس‌کیوال دیده می‌شوند. امروزه regexها به‌گستردگی در زبان‌های برنامه‌نویسی، برنامه‌های پردازش نوشتار (به‌ویژه تحلیل‌گرهای واژگانی)، ویرایشگرهای نوشتار پیشرفته و برخی برنامه‌های دیگر پشتیبانی می‌شوند. پشتیبانی از regex بخشی از کتابخانه استاندارد بسیاری از زبان‌های برنامه‌نویسی از جمله جاوا و پایتون است و در نحو برخی دیگر مانند پرل و اکما اسکریپت تعبیه شده‌است. الگوها عبارت عبارات باقاعده یا ریجکس‌ها (regex) اغلب برای اشاره به نحو متنی استاندارد و خاصی به کار می‌رود که برای نمایش الگوهای تطابق متن بهره‌گیری می‌شود و با نمادگذاری ریاضی که در ادامه توضیح داده می‌شود، تفاوت دارد. هر نویسه در یک عبارت باقاعده (یعنی هر نویسه در رشته‌ای که الگوی آن را توصیف می‌کند) یا یک است که معنایی ویژه دارد یا نویسه‌ای معمولی که معنایی تحت‌اللفظی دارد. برای نمونه، در ریجکس b.، نویسه «b» یک نویسه تحت‌اللفظی است که تنها با «b» تطابق دارد، در حالی که «.» یک متاکاراکتر است که با هر نویسه‌ای جز سطر جدید تطابق دارد؛ بنابراین این ریجکس، برای نمونه، با «b%»، «bx» یا «b5» تطابق دارد. متاکاراکترها و نویسه‌های تحت‌اللفظی با هم می‌توانند برای شناسایی متنی با الگوی مشخص یا پردازش تعدادی از نمونه‌های آن بهره‌گیری شوند. تطابق‌های الگو ممکن است از برابری دقیق تا شباهتی بسیار کلی تغییر کنند که توسط متاکاراکترها کنترل می‌شود. یک الگوی بسیار کلی است، [a-z] (تطابق با همه حروف کوچک از «a» تا «z») کمتر کلی است و b یک الگوی دقیق است (تنها با «b» تطابق دارد). نحو متاکاراکترها به‌گونه‌ای خاص طراحی شده تا هدف‌های مشخص را به شکلی مختصر و انعطاف‌پذیر برای راهبری خودکارسازی پردازش متن روی داده‌های ورودی گوناگون نمایش دهد، به‌گونه‌ای که تایپ آن با صفحه‌کلید استاندارد ASCII آسان باشد. نویسه‌های جانشین نیز این هدف را برآورده می‌کنند، اما در الگوپردازی محدودیت بیشتری دارند، چون متاکاراکترهای کمتر و پایه زبانی ساده‌تری دارند. زمینه معمول در همتاسازی نام‌های مشابه در فهرستی از پرونده‌هاست، در حالی که ریجکس‌ها معمولاً در برنامه‌هایی بهره‌گیری می‌شوند که الگوهای رشته‌های متنی را به‌طور کلی تطبیق می‌دهند. برای نمونه، ریجکس ^[\t]+|[\t]+$ با فاصله اضافی در ابتدا یا انتهای یک سطر تطابق دارد. یک عبارت باقاعده پیشرفته که با هر عدد اعشاری تطابق دارد، به شکل [+-]?(\d+(\.\d*)?|\.\d+ eE +-]?\d+)? است. یکی از رویکردهای ممکن، الگوریتم ساختمان تامپسون برای ساختن یک اتوماتون تعیین‌ناپذیر متناهی (NFA) است که سپس با قطعی می‌شود و پذیرنده متناهی معین (DFA) حاصل روی رشته متن هدف اجرا می‌شود تا زیررشته‌هایی را که با عبارت باقاعده تطابق دارند شناسایی کند. تصویر طرح NFA به صورت N(s*) را نشان می‌دهد که از عبارت باقاعده s* به دست آمده، جایی که s یک عبارت باقاعده ساده‌تر را نمایش می‌دهد که به‌نوبه خود از پیش به‌صورت بازگشتی به NFA N(s) برگردانده شده‌است. مفاهیم پایه یک عبارت باقاعده، که اغلب الگو نامیده می‌شود، مجموعه‌ای از رشته‌های متنی را که برای هدفی خاص نیاز است مشخص می‌کند. یک روش ساده برای مشخص کردن یک مجموعه متناهی از رشته‌ها، فهرست کردن عناصر یا اعضای آن است. با این حال، ممکن است روش‌های بسیاری برای نوشتن یک عبارت باقاعده برای یک مجموعه یکسان از رشته‌ها وجود داشته باشد: برای مثال، (Hän|Han|Haen)del نیز همان مجموعه سه رشته‌ای را در این مثال مشخص می‌کند. بیشتر چارچوب‌های صوری عملیات زیر را برای ساختن عبارت‌های باقاعده فراهم می‌آورند: «یا» بولی یک خط عمودی گزینه‌های جایگزین را از هم جدا می‌کند. گروه‌بندی پرانتزها برای تعریف محدوده و تقدم عملگرها (در میان کاربردهای دیگر) بهره‌گیری می‌شوند. کمّی‌سازی یک پس از یک عنصر (مانند یک نشانه، نویسه یا گروه) مشخص می‌کند که عنصر پیشین چند بار مجاز است تکرار شود. رایج‌ترین کمّی‌سازها علامت پرسش ?، ستاره * (برگرفته از ستاره کلین) و علامت جمع + هستند. برای مثال: a.b با هر رشته‌ای تطبیق دارد که شامل یک «a» و سپس هر نویسه‌ای و سپس «b» باشد. a.*b با هر رشته‌ای تطبیق دارد که شامل یک «a» و در نقطه‌ای بعد از آن نویسه «b» باشد. این ساختارها می‌توانند برای شکل‌دادن به عبارت‌های دلخواه پیچیده با یکدیگر ترکیب شوند، بسیار شبیه به آنکه از اعداد و عملیات +، −، × و ÷ برای ساختن عبارت‌های حسابی بهره می‌گیریم. نحو دقیق عبارت‌های باقاعده در ابزارهای مختلف و بسته به زمینه متفاوت است؛ جزئیات بیشتر در بخش نحو آمده‌است. نظریه زبان‌های صوری زبان‌های منظم در نظریه زبان‌های صوری با عبارت‌های باقاعده توصیف می‌شوند. تعریف صوری عبارت‌های باقاعده از ثوابت — که مجموعه‌هایی از رشته‌ها را نشان می‌دهند — و نمادهای عملگر — که عملیات روی این مجموعه‌ها را نشان می‌دهند — تشکیل می‌شوند. تعریف زیر استاندارد است و در بیشتر کتاب‌های درسی نظریه زبان‌های صوری یافت می‌شود. با داشتن یک الفبای متناهی Σ، ثوابت زیر به‌عنوان عبارت‌های باقاعده تعریف می‌شوند: (مجموعه تهی) ∅ که مجموعه ∅ را نشان می‌دهد. (رشته تهی) ε که مجموعه‌ای را نشان می‌دهد که تنها شامل رشته «تهی» است — رشته‌ای که هیچ نویسه‌ای ندارد. با داشتن عبارت‌های باقاعده R و S، عملیات زیر بر روی آن‌ها تعریف می‌شوند تا عبارت‌های باقاعده تولید کنند: (الحاق) (RS) مجموعه رشته‌هایی را نشان می‌دهد که می‌توان با الحاق یک رشته پذیرفته‌شده توسط R و یک رشته پذیرفته‌شده توسط S (به همین ترتیب) به دست آورد. (ستاره کلین) (R*) کوچک‌ترین فوق‌مجموعه مجموعه توصیف‌شده توسط R را نشان می‌دهد که شامل ε است و تحت بستار الحاق رشته بسته‌است. این مجموعه تمام رشته‌هایی است که می‌توان با الحاق هر تعداد متناهی (از جمله صفر) از رشته‌های مجموعه توصیف‌شده توسط R ساخت. برای مثال، اگر R نشان‌دهنده {"۰", "۱"} باشد، (R*) مجموعه تمام رشته‌های دودویی متناهی (از جمله رشته تهی) را نشان می‌دهد. برای جلوگیری از پرانتز، فرض می‌شود که ستاره کلین بالاترین اولویت را دارد و پس از آن الحاق و سپس جایگزینی قرار می‌گیرد. بسیاری از کتاب‌های درسی از نمادهای ∪، +، یا ∨ به‌جای خط عمودی برای جایگزینی بهره می‌گیرند. (a|b)* مجموعه تمام رشته‌هایی را نشان می‌دهد که هیچ نمادی جز "a" و "b" ندارند، از جمله رشته تهی: {ε, "a", "b", "aa", "ab", "ba", "bb", "aaa", ...} ab*(c|ε) مجموعه رشته‌هایی را نشان می‌دهد که با "a" آغاز می‌شوند، سپس صفر یا بیشتر "b" دارند و در نهایت به‌صورت اختیاری یک "c" دارند: {"a", "ac", "ab", "abc", "abb", "abbc", ...} (0|(1(01*0)*1 * مجموعه اعداد دودویی‌ای را نشان می‌دهد که مضرب ۳ هستند: { ε, "۰", "۰۰", "۱۱", "۰۰۰", "۰۱۱", "۱۱۰", "۰۰۰۰", "۰۰۱۱", "۰۱۱۰", "۱۰۰۱", "۱۱۰۰", "۱۱۱۱", "۰۰۰۰۰", ...} مشتق یک عبارت باقاعده را می‌توان با بهره‌گیری از تعریف کرد. قدرت بیانی و فشردگی تعریف صوری عبارت‌های باقاعده به‌عمد کمینه است و از تعریف ? و + پرهیز می‌کند — این‌ها را می‌توان به‌صورت زیر بیان کرد: a+=aa* و a?=(a|ε). گاهی عملگر متمم افزوده می‌شود تا یک عبارت باقاعده تعمیم‌یافته به دست آید؛ در اینجا Rc با تمام رشته‌های Σ* تطبیق می‌یابد که با R تطبیق نمی‌یابند. عبارت‌های باقاعده به این معنا می‌توانند زبان‌های منظم را بیان کنند — دقیقاً همان رده زبان‌هایی که توسط پذیرنده‌های متناهی معین پذیرفته می‌شوند. برخی از رده‌های زبان‌های منظم را تنها می‌توان با پذیرنده‌های متناهی معینی توصیف کرد که اندازه آن‌ها به‌صورت نمایی با اندازه کوتاه‌ترین عبارت‌های باقاعده معادل رشد می‌کند. نمونه استاندارد در اینجا زبان‌های Lk هستند که از تمام رشته‌ها بر روی الفبای {a,b} تشکیل شده‌اند که حرف kام از آخر آن‌ها برابر a است. از یک سو، یک عبارت باقاعده که L4 را توصیف می‌کند به‌صورت زیر داده می‌شود: تعمیم این الگو به Lk عبارت زیر را می‌دهد: از سوی دیگر، ثابت شده‌است که هر پذیرنده متناهی معینی که زبان Lk را می‌پذیرد باید حداقل ۲k حالت داشته باشد. خوشبختانه، یک نگاشت ساده از عبارت‌های باقاعده به اتوماتون‌های متناهی غیرقطعی (NFA) وجود دارد که به چنین انفجاری در اندازه منجر نمی‌شود؛ به همین دلیل از NFAها اغلب به‌عنوان نمایش‌های جایگزین زبان‌های منظم بهره گرفته می‌شود. در جهت مخالف، بسیاری از زبان‌هایی هستند که به‌راحتی با DFA توصیف می‌شوند اما به‌راحتی با عبارت باقاعده توصیف نمی‌شوند. برای نمونه، تعیین اعتبار یک شابک مستلزم محاسبه باقیمانده یک عدد صحیح مُدلو ۱۱ است و می‌توان آن را به‌راحتی با یک DFA یازده‌حالته پیاده‌سازی کرد. با داشتن یک عبارت باقاعده، الگوریتم ساختمان تامپسون یک اتوماتون متناهی غیرقطعی معادل محاسبه می‌کند. سرانجام، بسیاری از موتورهای «عبارت باقاعده» در دنیای واقعی ویژگی‌هایی را پیاده‌سازی می‌کنند که نمی‌توان آن‌ها را با عبارت‌های باقاعده به معنای نظریه زبان‌های صوری توصیف کرد؛ بلکه آن‌ها regex‌ها را پیاده‌سازی می‌کنند. | ## بخش 2: عبارت باقاعده | تصمیم‌گیری دربارهٔ هم‌ارزی عبارت‌های باقاعده همان‌طور که در بسیاری از نمونه‌های بالا دیده می‌شود، بیش از یک روش برای ساختن یک عبارت باقاعده برای رسیدن به نتایج یکسان وجود دارد. می‌توان یک الگوریتم نوشت که برای دو عبارت باقاعده داده‌شده تصمیم بگیرد آیا زبان‌های توصیف‌شده برابرند یا نه؛ این الگوریتم هر عبارت را به یک پذیرنده متناهی معین کمینه تقلیل می‌دهد و تعیین می‌کند که آیا آن‌ها یکریخت (معادل) هستند یا نه. قوانین جبری برای عبارت‌های باقاعده را می‌توان با روشی از گیشر به دست آورد که بهترین توضیح آن از طریق یک نمونه است: برای بررسی اینکه آیا (X+Y)∗ و (X∗ Y∗)∗ زبان منظم یکسانی را برای تمام عبارت‌های باقاعده X, Y نشان می‌دهند یا نه، لازم و کافی است که بررسی شود آیا عبارت‌های باقاعده خاص (a+b)∗ و (a∗ b∗)∗ زبان یکسانی را روی الفبای Σ={a,b} نشان می‌دهند. به‌طور کلی‌تر، یک معادله E=F بین عبارت‌های باقاعده با متغیرها اگر و تنها اگر نمونه‌سازی آن با متغیرهای مختلفی که با ثابت‌های نمادی مختلف جایگزین شده‌اند برقرار باشد. هر عبارت باقاعده را می‌توان صرفاً با ستاره کلین و اجتماع مجموعه روی کلمات متناهی نوشت. هر چند عبارت‌های باقاعده ساده هستند، هیچ روشی برای بازنویسی نظام‌مند آن‌ها به یک شکل نرمال وجود ندارد. پیش از آن، در سال ۱۹۶۴ (۱۳۴۳)، ردکو اثبات کرده بود که هیچ مجموعه متناهی از اکسیوم‌های صرفاً معادلاتی نمی‌تواند جبر زبان‌های منظم را توصیف کند. اتم یک نقطه منفرد در الگوی عبارت باقاعده است که سعی می‌کند با رشته هدف تطبیق یابد. ساده‌ترین اتم یک راستین‌نماد است، اما برای گروه‌بندی بخش‌هایی از الگو جهت تطبیق با یک اتم، باید از ( ) به عنوان متاکاراکتر بهره گرفت. متاکاراکترها در ساخت موارد زیر نقش دارند: اتم‌ها؛ سنجه‌ها که نشان می‌دهند چند اتم لازم است (و اینکه آیا است یا نه)؛ عملگر OR منطقی که مجموعه‌ای از گزینه‌ها را ارائه می‌دهد؛ عملگر NOT منطقی که وجود یک اتم را نفی می‌کند؛ و ارجاع‌های برگشتی برای اشاره به اتم‌های پیشین در یک الگوی تکمیل‌شده. تطبیق زمانی رخ نمی‌دهد که همه اتم‌های رشته تطبیق یابند، بلکه وقتی رخ می‌دهد که همه اتم‌های الگو در عبارت باقاعده تطبیق یافته باشند. ایده اصلی این است که یک الگوی کوچک از نویسه‌ها، تعداد زیادی از رشته‌های ممکن را نمایندگی کند، نه اینکه فهرست بزرگی از تمام احتمالات به صورت راستین‌نماد گردآوری شود. بسته به پردازشگر عبارت باقاعده، حدود چهارده متاکاراکتر وجود دارد؛ نویسه‌هایی که ممکن است بسته به زمینه، یا در صورتی که «گریخته» شده باشند (یعنی پیش از آن‌ها توالی گریز آمده باشد) معنای راستین‌نماد داشته یا نداشته باشند؛ در این حالت، بک‌اسلش \ به عنوان نویسه گریز بهره برده می‌شود. عبارات باقاعده مدرن و POSIX توسعه‌یافته متاکاراکترها را بیشتر از معنای راستین‌نمادشان به کار می‌برند؛ از این رو برای جلوگیری از «بک‌اسلش‌زدگی» یا ، این عبارات یک حالت گریز از متاکاراکتر به راستین‌نماد دارند؛ با این حال، در ابتدا چهار متاکاراکتر قاب‌بندی ( ) و { } اساساً راستین‌نماد هستند و «گریز» آن‌ها معنای متاکاراکتری می‌دهد. جداکننده‌ها هنگام وارد کردن یک عبارت باقاعده در یک زبان برنامه‌نویسی، ممکن است به صورت یک رشته متنی معمولی نمایش داده شود و معمولاً در علامت نقل‌قول قرار گیرد؛ این روش در جاوا، C و پایتون رایج است؛ برای مثال عبارت باقاعده re به صورت "re" وارد می‌شود. با این حال، اغلب با اسلش به عنوان جداکننده نوشته می‌شود؛ مانند /re/ برای عبارت باقاعده re. این روش از اد سرچشمه می‌گیرد؛ جایی که / دستور جستجو در ویرایشگر است و عبارت /re/ می‌تواند برای مشخص کردن بازه‌ای از خطوط (منطبق با الگو) بهره برده شود که در ترکیب با دستورها دیگر استفاده می‌شود؛ مشهورترین آن‌ها g/re/p در گرپ («global regex print» یا چاپ عبارت باقاعده سراسری) است که در بیشتر سیستم‌عامل‌های مبتنی بر یونیکس، مانند توزیع‌های لینوکس، گنجانده شده‌است. این نمادگذاری به ویژه به دلیل استفاده در پرل شناخته شده‌است که بخشی از نحو آن را تشکیل می‌دهد و از رشته‌های متنی عادی متمایز است. در برخی موارد، مانند sed و پرل، می‌توان از جداکننده‌های جایگزین بهره برد تا از تداخل با محتوا و نیاز به گریز دادن نمونه‌های نویسه جداکننده جلوگیری شود. برای مثال، در sed دستور s,/,X, یک / را با X جایگزین می‌کند و از کاما به عنوان جداکننده بهره می‌برد. ERE عملگرهای ?، + و | را افزوده و نیاز به گریز دادن متاکاراکترهای ( ) و { } را برطرف می‌کند؛ این گریز دادن در BRE الزامی بود. علاوه بر این، تا زمانی که نحو استاندارد POSIX برای عبارات باقاعده رعایت شود، نحو اضافی برای کاربردهای خاص (اما سازگار با POSIX) می‌تواند وجود داشته و اغلب هم وجود دارد. اگرچه POSIX.2 برخی جزئیات پیاده‌سازی را تعریف نکرده، BRE و ERE یک «استاندارد» ارائه می‌دهند که از آن زمان به عنوان نحو پیش‌فرض ابزارهای بسیاری پذیرفته شده‌است؛ در این ابزارها، انتخاب بین حالت‌های BRE یا ERE معمولاً گزینه‌ای پشتیبانی‌شده‌است. عبارات باقاعده پرل به یک استاندارد واقعی تبدیل شده‌اند و مجموعه‌ای غنی و قدرتمند از عبارات اتمی دارند. مانند POSIX ERE, ( ) و { } به عنوان متاکاراکتر در نظر گرفته می‌شوند مگر اینکه گریز داده شوند؛ دیگر متاکاراکترها تنها بر اساس زمینه، راستین‌نماد یا نمادین تلقی می‌شوند. پایه و توسعه‌یافته POSIX در استاندارد POSIX، نحو عبارت باقاعده پایه (BRE) ایجاب می‌کند که متاکاراکترهای ( ) و { } به صورت \(\) و \{\} نوشته شوند، در حالی که نحو عبارت باقاعده توسعه‌یافته (ERE) این الزام را ندارد. در ابزارهای مبتنی بر خط، با موقعیت شروع هر خط تطبیق می‌یابد..با هر نویسه منفرد تطبیق می‌یابد (بسیاری از برنامه‌ها نوخط‌ها را استثنا می‌کنند؛ اینکه دقیقاً کدام نویسه‌ها نوخط به‌شمار می‌آیند به گونه، کدبندی نویسه و پلتفرم بستگی دارد، اما می‌توان با اطمینان فرض کرد که نویسه تغذیه خط جزو آن‌هاست). برای مثال، a.c با «abc» و مانند آن تطبیق می‌یابد، اما [a.c] فقط با «a»، «.» یا «c» تطبیق می‌یابد.[ ]یک عبارت براکتی. نویسه - به عنوان یک نویسه راستین‌نماد تلقی می‌شود اگر آخرین یا اولین نویسه (پس از ^ در صورت وجود) داخل براکت‌ها باشد: [abc-]، [-abc]، [^-abc]. نویسه ] می‌تواند در یک عبارت براکتی گنجانده شود اگر اولین نویسه (پس از ^ در صورت وجود) باشد: abc]، [^]abc].[^]با یک نویسه منفرد که در داخل براکت‌ها قرار ندارد تطبیق می‌یابد. به همین ترتیب، نویسه‌های راستین‌نماد و بازه‌ها می‌توانند ترکیب شوند.$با موقعیت پایانی رشته یا موقعیت درست پیش از نوخط پایان رشته تطبیق می‌یابد. در ابزارهای مبتنی بر خط، با موقعیت پایانی هر خط تطبیق می‌یابد.( )یک زیرعبارت نشانه‌دار، همچنین گروه ضبطی نامیده می‌شود، که برای استخراج بخش موردنظر متن ضروری است (همچنین ورودی بعدی، \n، را ببینید). حالت BRE نیاز به دارد.\nبا آنچه nامین زیرعبارت نشانه‌دار تطبیق یافته تطبیق می‌یابد؛ n یک رقم از ۱ تا ۹ است. این ویژگی که به عنوان ارجاع برگشتی نیز شناخته می‌شود در حالت BRE پشتیبانی می‌شود.*با عنصر پیشین صفر یا چند بار تطبیق می‌یابد. \[.\] با هر نویسه منفرد احاطه‌شده توسط «[» و «]» تطبیق می‌یابد؛ زیرا براکت‌ها گریز داده شده‌اند؛ برای مثال: «[a]", "[b]»، «[۷]»، «[@]»، « » و «[ ]» (براکت فاصله براکت). کمیته قوانین پرل را با قانونی جایگزین کرد که توضیح آن ساده بود، اما قوانین «ساده» جدید در واقع پیاده‌سازی آن‌ها پیچیده‌تر بود: با ابزارهای از پیش موجود ناسازگار بودند و تعریف یک پسوند «تطبیق تنبل» (ببینید زیر) را عملاً غیرممکن می‌ساختند. در نتیجه، تعداد بسیار کمی از برنامه‌ها قوانین زیرعبارت POSIX را پیاده‌سازی می‌کنند (حتی وقتی بخش‌های دیگر نحو POSIX را پیاده‌سازی می‌کنند). متاکاراکترها در POSIX توسعه‌یافته معنای متاکاراکترهایی که با بک‌اسلش گریز داده می‌شوند در نحو عبارت باقاعده توسعه‌یافته POSIX (ERE) برای برخی نویسه‌ها معکوس می‌شود. با این نحو، بک‌اسلش سبب می‌شود متاکاراکتر به عنوان نویسه راستین‌نماد تلقی شود؛ بنابراین، برای مثال، \( \) اکنون ( ) می‌شود و \{ \} اکنون { } می‌شود. علاوه بر این، پشتیبانی از ارجاعات برگشتی \n حذف شده و متاکاراکترهای زیر افزوده می‌شوند: متاکاراکتر شرح ? با عنصر پیشین صفر یا یک بار تطبیق می‌یابد. | عملگر انتخاب (همچنین به عنوان جایگزینی یا اجتماع مجموعه شناخته می‌شود) با عبارت پیش از عملگر یا عبارت پس از آن تطبیق می‌یابد. عبارات باقاعده توسعه‌یافته POSIX اغلب می‌توانند با ابزارهای مدرن یونیکس با گنجاندن پرچم خط فرمان -E بهره برده شوند. رده‌های نویسه رده نویسه پس از تطبیق راستین‌نماد، پایه‌ای‌ترین مفهوم عبارت باقاعده است. این رده یک دنباله کوچک از نویسه‌ها را با مجموعه بزرگ‌تری از نویسه‌ها تطبیق می‌دهد. برای مثال، [A-Z] می‌تواند نماینده هر حرف بزرگ در الفبای انگلیسی باشد و \d می‌تواند به معنای هر رقم باشد. هنگام مشخص کردن بازه‌ای از نویسه‌ها، مانند [a-Z] (یعنی حرف کوچک a تا حرف بزرگ Z)، تنظیمات محلی رایانه محتوا را بر اساس ترتیب عددی کدبندی نویسه تعیین می‌کند. از این رو استاندارد POSIX یک رده نویسه تعریف می‌کند که توسط پردازشگر عبارت باقاعده نصب‌شده شناخته می‌شود. این واقعیت را منعکس می‌کند که در بسیاری از زبان‌های برنامه‌نویسی، این نویسه‌ها همان‌هایی هستند که می‌توانند در شناسه‌ها بهره برده شوند. ویرایشگر Vim علاوه بر این بین رده‌های کلمه و سر کلمه (با استفاده از نمادگذاری \w و \h) تمایز قائل می‌شود؛ زیرا در بسیاری از زبان‌های برنامه‌نویسی، نویسه‌هایی که می‌توانند یک شناسه را شروع کنند با نویسه‌هایی که می‌توانند در موقعیت‌های دیگر ظاهر شوند یکسان نیستند: ارقام معمولاً مستثنا هستند، بنابراین یک شناسه در نمادگذاری POSIX شبیه \h\w* یا :alpha:]_ :alnum:]_]* خواهد بود. پرل و PCRE به دلیل قدرت بیانی و (نسبی) سهولت خواندن، بسیاری از ابزارها و زبان‌های برنامه‌نویسی دیگر نحو مشابه پرل را پذیرفته‌اند؛ برای نمونه جاوا، جاوااسکریپت، جولیا، پایتون، روبی، کیوت، مایکروسافت و . پیاده‌سازی‌های regex مشتق از پرل با یکدیگر یکسان نیستند و معمولاً زیرمجموعه‌ای از ویژگی‌های موجود در Perl 5.0 (منتشرشده در ۱۹۹۴) را پیاده‌سازی می‌کنند. پرل گاهی ویژگی‌هایی را که ابتدا در زبان‌های دیگر یافت می‌شوند در خود جای می‌دهد. برای نمونه، Perl 5.10 گسترش‌های نحوی‌ای را پیاده‌سازی می‌کند که در اصل در PCRE و پایتون توسعه یافته بودند. تطبیق تنبل در پایتون و برخی پیاده‌سازی‌های دیگر (مثلاً جاوا)، سه کمیت‌ساز متداول (*، + و ?) به‌طور پیش‌فرض حریصانه هستند، زیرا تا آنجا که ممکن است نویسه‌های بیشتری را تطبیق می‌دهند. با این حال، کمیت‌سازهای یادشده را می‌توان با افزودن یک علامت سؤال، تنبل، کمینه یا بی‌میل کرد تا تا آنجا که ممکن است نویسه‌های کمتری را تطبیق دهند: ".+?" تنها "Ganymede," را تطبیق می‌دهد. از این‌رو، کمیت‌سازهای مالکانه بیشترین کاربرد را در کنار رده‌های نویسه نفی‌شده دارند؛ مثلاً "[^"]*+" که هنگام اعمال بر همان رشته، "Ganymede," را تطبیق می‌دهد. گسترش رایج دیگری که همین کارکرد را دارد، گروه‌بندی اتمی است که بازگشت به عقب را برای یک گروه داخل پرانتز غیرفعال می‌کند. برای نمونه، در حالی که هر دو و را تطبیق می‌دهد، تنها را تطبیق می‌دهد، چون موتور از بازگشت به عقب ممنوع است و نمی‌تواند پس از تطبیق «wi» تلاش کند گروه را برابر «w» قرار دهد. کمیت‌سازهای مالکانه پیاده‌سازی آسان‌تری نسبت به کمیت‌سازهای حریصانه و تنبل دارند و معمولاً در زمان اجرا کارآمدتر هستند. این استاندارد زیرمجموعه محدودی از اصطلاحات عبارت باقاعده را مشخص می‌کند که برای همکاری‌پذیری طراحی شده‌اند؛ یعنی در تعداد زیادی از کتابخانه‌های عبارت باقاعده همان اثر را ایجاد می‌کنند. I-Regexp همچنین به تطبیق محدود است؛ یعنی تنها یک نتیجه درست یا نادرست بین عبارت باقاعده و یک قطعه متن ارائه می‌دهد. از این‌رو، فاقد ویژگی‌های پیشرفته‌ای مانند گروه‌های ضبط، نگاه به جلو و ارجاع به عقب است. الگوهایی برای زبان‌های غیرمنظم بسیاری از ویژگی‌هایی که در تقریباً تمام کتابخانه‌های مدرن عبارات باقاعده یافت می‌شوند، قدرت بیانی‌ای فراتر از زبان‌های منظم فراهم می‌کنند. برای نمونه، بسیاری از پیاده‌سازی‌ها اجازه می‌دهند زیرعبارت‌ها با پرانتز گروه‌بندی شوند و مقداری که با آن‌ها تطبیق می‌یابد در همان عبارت فراخوانی شود ( یا ارجاع پسگرد). زبان مربع‌ها نه منظم است و نه مستقل از متن، به دلیل لم تزریق، اما تطبیق الگو با تعداد نامحدودی ارجاع پسگرد، که ابزارهای مدرن فراوانی از آن پشتیبانی می‌کنند، همچنان حساس‌به‌متن است. Theorem 3 (p.9) مسئله کلی تطبیق با هر تعداد ارجاع پسگرد NP-کامل است و زمان اجرا برای الگوریتم‌های شناخته‌شده به‌صورت نمایی با تعداد گروه‌های ارجاع پسگرد رشد می‌کند. با این حال، بسیاری از ابزارها، کتابخانه‌ها و موتورهایی که چنین ساختارهایی ارائه می‌دهند همچنان اصطلاح «عبارت باقاعده» را برای الگوهایشان به کار می‌برند. این امر به نامگذاری‌ای انجامیده که در آن اصطلاح «عبارت باقاعده» در نظریه زبان صوری و تطبیق الگو معناهای متفاوتی دارد. lookaroundها محدوده پیرامون یک تطبیق را تعریف می‌کنند و به خود تطبیق سرریز نمی‌کنند؛ ویژگی‌ای که تنها برای موردکاربرد جستجوی رشته مرتبط است. | ## بخش 3: عبارت باقاعده | برخی از آن‌ها می‌توانند در یک زبان منظم با در نظر گرفتن محدوده‌های پیرامون به‌عنوان بخشی از زبان شبیه‌سازی شوند. پیاده‌سازی‌ها و زمان‌های اجرا دست‌کم سه الگوریتم متفاوت وجود دارد که تعیین می‌کنند آیا یک عبارت باقاعده با یک رشته تطابق دارد یا خیر و در صورت تطابق، چگونه. قدیمی‌ترین و سریع‌ترین رویکرد بر پایه نتیجه‌ای در نظریه زبان‌های صوری است که طبق آن هر اتوماتون تعیین‌ناپذیر متناهی (NFA) را می‌توان به پذیرنده متناهی معین (DFA) تبدیل کرد. DFA را می‌توان به‌صورت صریح ساخت و سپس با پردازش یک‌به‌یک نمادهای رشته ورودی اجرا کرد. ساخت DFA برای یک عبارت باقاعده با اندازه m هزینه زمانی و حافظه‌ای برابر O(2m) دارد، اما می‌توان آن را روی رشته‌ای با اندازه n در زمان O(n) اجرا کرد. توجه شود که اندازه عبارت، اندازه‌ای است که پس از گسترش اختصارات مانند سنج‌های عددی به دست می‌آید. رویکرد جایگزین، شبیه‌سازی مستقیم NFA است؛ به این معنا که هر حالت DFA به‌صورت بر حسب تقاضا ساخته می‌شود و در گام بعدی دور انداخته می‌شود. این روش DFA را ضمنی نگه می‌دارد و از هزینه ساخت نمایی اجتناب می‌کند، اما هزینه اجرا به O(mn) می‌رسد. این الگوریتم‌ها سریع هستند، اما کاربرد آن‌ها برای بازیابی زیرعبارات گروه‌بندی‌شده، سنج‌های تنبل و ویژگی‌های مشابه دشوار است. این الگوریتم معمولاً NFA نامیده می‌شود، اما این اصطلاح می‌تواند گمراه‌کننده باشد. زمان اجرای آن می‌تواند نمایی باشد؛ این رفتار در پیاده‌سازی‌های ساده هنگام تطبیق با عباراتی مانند که هم ترکیب و هم سنج‌های نامحدود دارند نمایان می‌شود و الگوریتم را وادار می‌کند تعداد نمایی رو به افزایشی از زیرحالت‌ها را بررسی کند. گرچه پیاده‌سازی‌های مبتنی بر پس‌گرد تنها در بدترین حالت ضمانت نمایی می‌دهند، انعطاف‌پذیری و قدرت بیانی بسیار بیشتری فراهم می‌کنند. برای نمونه، هر پیاده‌سازی‌ای که امکان کاربرد پس‌ارجاع‌ها را بدهد یا گسترش‌های گوناگون معرفی‌شده توسط پرل را پیاده‌سازی کند، باید نوعی پس‌گرد داشته باشد. برخی پیاده‌سازی‌ها تلاش می‌کنند بهترین هر دو الگوریتم را فراهم کنند: ابتدا الگوریتم DFA سریع را اجرا می‌کنند و تنها هنگامی که پس‌ارجاعی در حین تطابق یافت می‌شود به الگوریتم پس‌گرد که ممکن است کندتر باشد بازمی‌گردند. الگوریتم‌هایی با زمان اجرای زیرخطی با استفاده از (BM) و تکنیک‌های بهینه‌سازی DFA مرتبط مانند پویش معکوس به دست آمده‌اند. که تطبیق تقریبی را پیاده‌سازی می‌کند، پیش‌فیلتر را در BDM (تطبیق معکوس DAWG) ادغام می‌کند. چند جایگزین نظری برای پس‌گرد در پس‌ارجاع‌ها وجود دارد و «توان‌های» آن‌ها ملایم‌تر هستند، زیرا تنها به تعداد پس‌ارجاع‌ها وابسته‌اند که ویژگی ثابتی از برخی زبان‌های regexp مانند POSIX است. یک روش ساده که یک NFA بدون پس‌گرد را به ازای هر پس‌ارجاع تکثیر می‌کند، پیچیدگی زمانی و پیچیدگی فضایی برای یک رشته جستجو با طول n و k پس‌ارجاع در عبارت باقاعده دارد. کارهای نظری مبتنی بر اتوماتون‌های حافظه‌دار، کران محکم‌تری بر اساس گره‌های متغیر «فعال» ارائه می‌دهند و امکان‌پذیری چندجمله‌ای را برای برخی عبارات باقاعده دارای پس‌ارجاع نشان می‌دهند. یونی‌کد از دیدگاه نظری، هر مجموعه‌ای از نشانه‌ها را می‌توان با عبارات باقاعده تطبیق داد، به شرطی که از پیش تعریف شده باشند. در پیاده‌سازی‌های تاریخی، عبارات باقاعده در اصل برای مجموعه نشانه‌های اسکی نوشته می‌شدند، اگرچه کتابخانه‌های regex از مجموعه‌های نویسه‌ای فراوان دیگری نیز پشتیبانی کرده‌اند. بسیاری از موتورهای مدرن عبارات باقاعده دست‌کم پشتیبانی ابتدایی از یونی‌کد را ارائه می‌دهند. در بیشتر جنبه‌ها، تفاوتی نمی‌کند که مجموعه نویسه چیست، اما هنگام گسترش عبارات باقاعده برای پشتیبانی از یونی‌کد، برخی مسائل پدیدار می‌شوند. برخی کتابخانه‌های regex انتظار دارند با رمزگذاری خاصی کار کنند، نه با نویسه‌های انتزاعی یونی‌کد. بسیاری از آن‌ها رمزگذاری یوتی‌اف-۸ را می‌طلبند، در حالی که برخی دیگر ممکن است یا را انتظار داشته باشند. در مقابل، Perl و Java نسبت به رمزگذاری بی‌تفاوت‌اند و در درون خود با نویسه‌های رمزگشایی‌شده کار می‌کنند. بسیاری از موتورهای عبارات باقاعده تنها از صفحه پایه چندزبانه پشتیبانی می‌کنند؛ یعنی نویسه‌هایی که با تنها ۱۶ بیت قابل رمزگذاری هستند. در حال حاضر (از سال ۲۰۱۶) تنها چند موتور عبارات باقاعده (مانند Perl و Java) می‌توانند محدوده کامل ۲۱ بیتی یونی‌کد را پردازش کنند. برخی پیاده‌سازی‌ها، مانند gawk، اجازه نمی‌دهند بازه‌های نویسه از میان بلوک‌های یونی‌کد عبور کنند. بازه‌ای مانند [0x61, 0x7F] معتبر است چون هر دو انتها در بلوک لاتین پایه قرار دارند، و [0x0530, 0x0560] نیز معتبر است چون هر دو انتها در بلوک ارمنی قرار دارند، اما بازه‌ای مانند [0x0061, 0x0532] نامعتبر است زیرا چندین بلوک یونی‌کد را دربرمی‌گیرد. موتورهای دیگر، مانند ویرایشگر ویم، اجازه عبور از بلوک‌ها را می‌دهند اما مقادیر نویسه‌ها نباید بیش از ۲۵۶ واحد از هم فاصله داشته باشند. نویسه‌هایی که دقیقاً به رده‌های POSIX تعلق دارند نیز از موتوری به موتور دیگر متفاوت است. از آن‌جا که اسکی دارای تمایز حروف بزرگ و کوچک است، بی‌تفاوتی نسبت به حروف ویژگی منطقی‌ای در جستجوی متن شد. برای خط‌هایی مانند چینی، تمایز منطقی دیگری به ذهن می‌رسد: میان صورت‌های سنتی و ساده‌شده. در خطوط عربی، بی‌تفاوتی نسبت به موقعیت‌های آغازی، میانی، پایانی و مستقل ممکن است مطلوب باشد. مانند ماشین‌های تحریر قدیمی، نویسه‌های پایه ساده (فاصله‌ها، نویسه‌های نگارشی، نمادها، رقم‌ها یا حروف) می‌توانند با یک یا چند نماد غیرفاصله‌ساز (معمولاً نشانه‌های تلفظی مانند علامت‌های لهجه که حروف را تغییر می‌دهند) همراه شوند تا یک نویسه قابل چاپ واحد بسازند؛ اما یونی‌کد همچنین مجموعه محدودی از نویسه‌های از پیش ترکیب‌شده را فراهم می‌کند، یعنی نویسه‌هایی که از پیش یک یا چند نویسه ترکیبی را دربردارند. یک توالی از نویسه پایه به اضافه نویسه‌های ترکیبی باید با نویسه واحد از پیش ترکیب‌شده یکسان، تطبیق داده شود (تنها برخی از این توالی‌های ترکیبی می‌توانند در یک نویسه یونی‌کدی واحد از پیش ترکیب شوند، اما توالی‌های ترکیبی بی‌شماری در یونی‌کد ممکن‌اند و برای زبان‌های گوناگون با استفاده از یک یا چند نویسه ترکیبی پس از یک نویسه پایه اولیه نیاز هستند؛ این توالی‌های ترکیبی ممکن است شامل یک نویسه پایه یا نویسه‌های ترکیبی به‌صورت جزئی از پیش ترکیب‌شده باشند، اما لزوماً در ترتیب متعارف نیستند و لزوماً از ترکیب‌های متعارف بهره نمی‌برند). فرایند استانداردسازی توالی‌های «نویسه پایه + نویسه‌های ترکیبی» از طریق تجزیه این توالی‌های هم‌ارز متعارف، پیش از مرتب‌سازی آن‌ها به ترتیب متعارف (و به‌صورت اختیاری ترکیب مجدد برخی نویسه‌های ترکیبی با نویسه پایه ابتدایی)، نرمال‌سازی نامیده می‌شود. یونی‌کد در میان کدهای دیگر، نشان‌های ترتیب بایت و نشانگرهای جهت متن را معرفی کرد. معرفی رده‌های نویسه برای بلوک‌های یونی‌کد، خط‌ها، و ویژگی‌های نویسه‌ای فراوان دیگر. ویژگی‌های بلوک بسیار کمتر از ویژگی‌های خط مفیدند، زیرا یک بلوک می‌تواند موقعیت‌های کد از چندین خط مختلف داشته باشد و یک خط می‌تواند موقعیت‌های کد از چندین بلوک مختلف داشته باشد. به‌طور کلی، \p{X} با هر نویسه‌ای تطبیق می‌یابد که دارای ویژگی دودویی X یا رده عمومی X باشد. پشتیبانی زبان‌ها بیشتر زبان‌های برنامه‌نویسی همه‌منظوره از قابلیت‌های عبارت باقاعده پشتیبانی می‌کنند، یا به‌صورت بومی یا از طریق کتابخانه‌ها. کاربردها عبارت‌های باقاعده در طیف گسترده‌ای از وظایف پردازش نوشتار و به‌طور کلی‌تر پردازش رشته‌ها کاربرد دارند؛ حتی در مواردی که داده‌ها لزوماً متنی نیستند. کاربردهای رایج شامل ، استخراج داده (به‌ویژه استخراج از وب)، آماده‌سازی داده‌ها، تجزیه ساده، ساخت سامانه‌های برجسته‌سازی نحوی و بسیاری وظایف دیگر می‌شود. برخی نرم‌افزارهای پیشرفته نشر رومیزی توانایی بهره‌گیری از عبارت‌های باقاعده را برای اعمال خودکار قالب‌بندی متن دارند و بدین ترتیب کسی که طرح‌بندی را انجام می‌دهد از زحمت انجام دستی این کار برای هر چیزی که با عبارت باقاعده قابل تطبیق است رهایی می‌یابد. برای نمونه، با تعریف یک که متن را به حروف کوچک‌بزرگ (Small Caps) تبدیل می‌کند و سپس بهره‌گیری از عبارت باقاعده [A-Z 4,} برای اعمال آن سبک، هر واژه‌ای که چهار یا بیش از چهار حرف بزرگ پشت‌سر هم داشته باشد به‌طور خودکار به‌صورت حروف کوچک‌بزرگ نمایش داده می‌شود. هرچند در بسیاری از موارد مدیران سیستم می‌توانند به‌صورت داخلی پرسش‌های مبتنی بر عبارت باقاعده اجرا کنند، اما بیشتر موتورهای جستجو پشتیبانی از عبارت باقاعده را برای عموم ارائه نمی‌دهند. نمونه‌ها قوانین نحوی خاص بسته به پیاده‌سازی، زبان برنامه‌نویسی یا کتابخانه مورد بهره‌گیری متفاوت است. افزون بر این، قابلیت‌های پیاده‌سازی‌های عبارت باقاعده ممکن است میان گوناگون تفاوت داشته باشد. از آنجا که توضیح و درک عبارت‌های باقاعده بدون نمونه دشوار است، وب‌سایت‌های تعاملی برای آزمایش عبارت‌های باقاعده منبعی سودمند برای یادگیری آن‌ها از راه آزمایش‌اند. این بخش شرحی پایه‌ای از برخی ویژگی‌های عبارت‌های باقاعده را از راه نمونه ارائه می‌دهد. در نمونه‌ها از قراردادهای زیر بهره گرفته می‌شود.نویسه «m» همیشه برای مشخص کردن عملیات تطبیق در پرل لازم نیست. «m» تنها هنگامی لازم است که کاربر بخواهد عملیات تطبیق را بدون بهره‌گیری از اسلش به‌عنوان حائل عبارت باقاعده مشخص کند. گاهی مشخص کردن یک حائل جایگزین برای عبارت باقاعده سودمند است تا از «برخورد حائل» پرهیز شود. metacharacter(s) ;; ستون متاکاراکتر نحو عبارت باقاعده نمایش‌داده‌شده را مشخص می‌کند =~ m// ;; نشان‌دهنده عملیات تطبیق عبارت باقاعده در پرل =~ s/// ;; نشان‌دهنده عملیات جایگزینی عبارت باقاعده در پرل همه این عبارت‌های باقاعده از نحو شبه‌پرل هستند. مگر آنکه خلاف آن ذکر شده باشد، نمونه‌های زیر با زبان برنامه‌نویسی پرل، نسخه ۵٫۸٫۸، ۳۱ ژانویه ۲۰۰۶ (۱۱ بهمن ۱۳۸۴) تطابق دارند. این بدان معناست که پیاده‌سازی‌های دیگر ممکن است از بخش‌هایی از نحو نشان‌داده‌شده اینجا پشتیبانی نکنند (مثلاً عبارت باقاعده پایه در برابر توسعه‌یافته، \( \) در برابر یا نبود \d به‌جای [:digit:] در پازیکس). معمولاً با هر نویسه‌ای جز سطر جدید تطابق دارد.درون کروشه، نقطه به‌صورت تحت‌اللفظی است. ( ) مجموعه‌ای از عناصر الگو را به یک عنصر واحد گروه‌بندی می‌کند.هنگامی که الگویی درون پرانتز تطبیق می‌یابد، می‌توان از $1، $2، … برای ارجاع به الگوی تطبیق‌یافته قبلی بهره گرفت. ? عبارت باقاعده‌ای که با *، +، ? یا {M,N} پیش از آن آمده را تغییر می‌دهد تا تا حد ممکن کم‌تر تطابق یابد. {M,N} حداقل M و حداکثر N بار تطابق را مشخص می‌کند.N را می‌توان حذف کرد و M می‌تواند ۰ باشد: {M} دقیقاً M بار تطابق می‌یابد؛ {M,} دست‌کم M بار تطابق می‌یابد؛ {0,N} حداکثر N بار تطابق می‌یابد.x* y+ z? بنابراین معادل x{0,} y{1,} z{0,1} است. \b با مرز پهنای صفر میان یک نویسه از رده کلمه (ببینید بعدی) و یک نویسه غیرکلمه یا لبه تطابق دارد؛ معادل (^\w|\w$|\W\w|\w\W). \s با یک نویسه فاصله خالی تطابق دارد؛که در ASCII عبارت است از تب، تغذیه خط، تغذیه صفحه، بازگشت کالسکه و فاصله؛در یونی‌کد همچنین با فاصله‌های غیرقابل‌شکست، سطر بعد و فاصله‌های با پهنای متغیر (در میان دیگران) تطابق دارد. استقرا عبارت‌های باقاعده را اغلب می‌توان بر پایه مجموعه‌ای از رشته‌های نمونه «استنتاج» یا «یادگیری» کرد. این فرایند به نام شناخته می‌شود و بخشی از مسئله کلی در نظریه یادگیری محاسباتی است. به‌طور رسمی، با داشتن نمونه‌هایی از رشته‌های یک زبان منظم و شاید نیز نمونه‌هایی از رشته‌هایی که در آن زبان منظم نیستند، می‌توان یک دستور زبان برای آن زبان استنتاج کرد؛ یعنی یک عبارت باقاعده که آن زبان را تولید می‌کند. همه زبان‌های منظم را نمی‌توان به این شیوه استنتاج کرد (نگاه کنید به )، اما بسیاری از آن‌ها را می‌توان. | ## جمع‌بندی | برای نمونه، مجموعه نمونه‌های {۱, ۱۰, ۱۰۰} و مجموعه منفی (نمونه‌های مخالف) {۱۱, ۱۰۰۱, ۱۰۱, ۰} را می‌توان برای استنتاج عبارت باقاعده ۱⋅۰* (عدد ۱ و پس از آن صفر یا بیشتر صفر) به کار برد.