عبارتهای منظم (RE) یک ساختار دانش کامپیوتر میباشند، و برای تعیین اینکه آیا یک رشته با برخی انواع الگو مطابقت دارد به کار میروند. گونههای بیشماری شامل هر دو تنوع دستوری و معنایی وجود دارد. اجازه بدهید با تئوری آغاز کنیم.
Aیک عبارت منظم متشکل از سه ویژگی است:
الحاق. دو عبارت منظم میتوانند یکی پس از دیگری نوشته شوند. عبارت بزرگتر حاصل با یک رشته ورودی منطبق خواهد گردید «اگر و فقط اگر» آن قسمت از رشته ورودی که با عبارت کوچکتر اول مطابقت دارد بلافاصله با قسمتی که با عبارت کوچک دوم مطابقت مینماید، دنبال شود.
اتحاد. این به طور اساسی یک عملگر «یا» میباشد. اگر یکی از عبارتهای کوچکتر با ورودی منطبق گردد، عبارت بزرگتر با ورودی منطبق خواهد شد.
Closure. که "Kleene closure" (کلی-نی تلفظ شده)نیز نامیده میشود. عبارت کوچک میتواند صفر یا چند بار به منظور انظباق با ورودی تکرار گردد.
(من در اینجا مشغول استفاده از زبان ریاضی نیستم. اگر شما تعاریف رسمی را نیاز دارید، لطفاًبه جای آن یک کتاب درسی دانش کامپیوتر را ملاحظه نمایید.)
ترکیبی که این ویژگیها توسط آن بیان میشوند در میان پیادهسازیهای مختلف RE به طور گستردهای متفاوت است. ما با ترکیب استفاده شده توسط فرمان egrep یونیکس آغاز میکنیم، زیرا احتمالاً بیش از همه متداول است. این هم مثالهایی از سه ویژگی موردنیاز، با استفاده از این ترکیب:
الحاق. عبارت منظم ab بر یک رشته ورودی ab منطبق میشود.
اتحاد. RE به صورتa|b بر یک رشته ورودی a یا یک رشته ورودی b منطبق میشود. این RE بر رشته ab منطبق نمیگردد.
Closure. RE به شکل a* بر رشته تهی، یا یک رشته ورودی a، یا یک رشته aa، و غیره منطبق میگردد.
واضح است، به منظور هرگونه استفاده عملی، این ویژگیها باید با یکدیگر ترکیب بشوند.
RE به صورت f(oo|ee)t با foot یا feet مطابقت میکند. (پرانتزها و یک ویژگی را ارایه میکنند که به عنوان گروهبندی شناخته میشود.)
RE به صورت a(0|1|2|3|4|5|6|7|8|9) با a0 یا a1 یا ... یا a9 مطابقت میکند.
اکثر پیادهسازیهای RE دارای میانبرهایی برای کاهش بسیار طول و زشتی عبارتهای رایج میباشند. برای مثال، در egrep، مثال قبل ما میتوانست نوشته شود:
عبارت منظم a[0-9] با a0 یا a1 یا ... یا a9 منطبق میگردد.
ترکیب [...] یک کلاس کاراکتر یا یک a عبارت براکت نامیده میشود، و یک عملیات اتحاد ضمنی را مشخص میکند. عبارت نتیجه با هر کاراکتر منفردی که در محدوده مشخص شده قرار میگیرد منطبق میشود. به هر حال، این مورد متکی به ترتیب کاراکترها میباشد. در حالت ارقام، خطر زیادی ندارد، اما در حالت حروف الفبا، ترتیب ASCII نمیتواند بدون خطر پنداشته شود. بنابراین، پیادهسازیهای مدرن egrep به جای آن نامهای کلاس را فراهم میکنند:
RE به صورت a[[:digit:]] بر a0 یا a1 یا ... یا a9 منطبق میگردد.
RE به صورت [[:alpha:]]0 با a0 یا B0 یا .... مطابقت دارد.
مخصوصاً کلاس کاراکتر [[:space:]] سودمند است، این کلاس بر هر کاراکتری که به صورت فضای سفید نمایش داده میشود (شامل فاصلهها، tabها، تعویض سطر، و غیره) منطبق میشود.
اکنون اخبار نامساعد: ترکیبها و مجموعه ویژگیهای بسیار زیاد عبارت منظمِ مورد استفاده عمومی وجود دارد. بدون دانستن آنکه کدام ابزار برای استفاده آن به کار برده میشود، تعیین آنکه کدام ترکیب مفروض RE مناسب است نقریباً غیر ممکن است. بیایید نگاهی به برخی از موارد رایج داشته باشیم.
عبارتهای منظم توسعه یافته (ERE). این ترکیبی است که توسط egrep استفاده شده، بعلاوه عملگر [[ ... =~ ... ]] متعلق به Bash.
ERE به صورت a+ بر a یا aa یا .... منطبق میشود، این مورد بر رشته تهی منطبق نمیشود. به بیان دیگر، + یعنی «یکی یا بیشتر».
ERE به صورت ab? معادل عبارت منظم a(b|) میباشد. بر a یا ab منطبق میشود. به عبارت دیگر، ? یعنی «یک مورد انتخابی».
ERE به شکل a{3} معادل عبارت منظم aaa میباشد. این مورد فقط بر aaa منطبق میشود. به بیان دیگر «دقیقاً سه مرتبه».
ERE به شکل a{3,} معادل عبارت منظم aaaa* است. این ERE بر aaa یا aaaa یا هر رشته بلندتری از aها. به بیان دیگر، «سه مرتبه یا بیشتر».
ERE به شکل a{,3} معادل عبارت منظم |a|aa|aaa است. این مورد بر رشته تهی یا a یا aa یا aaa منطبق میگردد. به عبارت دیگر، «تا سه مرتبه».
ERE به شکل a{3,5} معادل عبارت منظم aaa|aaaa|aaaaa میباشد. به بیان دیگر، «بین سه تا پنج بار».
عبارت منظم اصلی (BRE). این ترکیب استفاده شده توسط فرمانهای grep و sed یونیکس است. در ترکیب BRE، تمام کاراکترها غیر از .، [، \، *، ^ و $ لفظی هستند. هیچ عملگر اتحاد (جدا از عبارتهای براکت منطبقشونده بر یک کاراکتر منفرد وجود ندارد)، به هر حال، گروهبندی توسط \( و \) پشتیبانی میشود.
بر خلاف باور عموم، شما نمیتوانید کاراکتر \ را در جلوی عملگرهای ERE از قبیل | برای قابل کار کردن آنها در BRE استفاده نمایید. انجام این عمل یک الحاقیه گنو است، فقط در برخی برنامههای گنو از قبیل sed گنو و grep گنو در دسترس میباشد.
اگر چه، ترکیب \{m,n\} در BRE پشتیبانی میشود، و دارای همان معنی {m,n} در ERE میباشد. احتمالاً این موردی است که گنو از آن برای توسعه این نماد گذاری به عملگر | الهام گرفته است.
عبارت منظم سازگار با پرل (PCRE).
globهای توسعهیافته ("extglob") به عنوان عبارتهای منظم بیان میشوند، آنها دارای closure، اتحاد و گروهبندی عملگرها هستند. ترکیب متفاوت با ترکیب EREها میباشد -- globهای توسعهیافته یک نشانه پیشوندی (در جایی که عملگر قبل از عملوندهایش ظاهر میشود)، به جای پسوندی مشابه در EREها، استفاده میکنند.
Extglob به صورت @(foo|bar) بر یک کدام از foo یا bar منطبق میشود. (اتحاد)
Extglob به شکل *(foo) بر هیچ یا چند نمونه foo منطبق میگردد. (Closure.)
Extglob به شکل ?(foo) بر صفر یا یک نمونه از foo منطبق میشود. (مانند عملگر ? در ERE.)
در اکثر پیادهسازیها، به طور پیشفرض عبارتهای منظم مهار نمیشوند. این یعنی عبارت به جای کل ورودی با هر قسمتی از رشته ورودی میتواند منطبق گردد. بدین ترتیب، BRE به شکلabc استفاده شده در grep (برای مثال) با رشته ورودی abcdefg منطبق خواهد شد. اگر میخواهید grep به شکل متفاوتی عمل کند، باید مشخص کنید که آیا عبارت شما در ابتدای سطر، در انتهای سطر، یا در هر دو طرف مهار میشود:
grep '^abc' با یک سطر ورودی abcde منطبق میشود اما با 42abc یا 42abcde منطبق نمیشود. کاراکتر ^ در ابتدای یک BRE یا ERE موجب میگردد عبارت در ابتدای سطر مهار گردد.
grep 'xyz$' با یک سطر ورودی tuvwxyz منطبق میشود اما با xyzzy خیر. کاراکتر $ در انتهای یک BRE یا ERE عبارت را در انتهای سطر مهار میکند.
grep '^abc$' فقط با یک سطر ورودی abc مطابقت میکند. عبارت در هر دو طرف ابتدا و انتهای سطر مهار گردیده است.
عبارت منظم (آخرین ویرایش 2011-04-14 10:08:48 توسط c-69-181-152-24)