عبارات منظم
در فصلهای قبل و در بررسی دستوراتی مانند grep و sed نمونهای از استفاده
از عبارات منظم را مشاهده کردید. در این فصل نگاهی دقیقتر به عبارات منظم
داشته و بررسی کاملی از آن ارائه میکنیم.
محتویات[نهفتن] |
عبارت منظم چیست؟
یک عبارت منظم مجموعهای از چند کاراکتر است که دارای یک الگوی مشخص هستند. همچنین عبارات منظم را به طور اختصار regex یا regexp نامگذاری میکنند. عبارات منظم زمانی میتوانند مفید واقع شوند که شما در یک متن به دنبال یک عبارت خاص هستید و نیاز دارید تا تغییراتی در آن ایجاد کنید. البته با استفاده از regexها در زمان تنها میتوان یک خط از متن را مورد پردازش قرار داد.
ساختمان عبارات منظم
هر عبارت منظم به سه بخش کلی تقسیم میشود:
anchors: ازanchor برای مشخص کردن مکان یک الگو در یک خط استفاده میشود.
Character Sets: این بخش شامل مجموعهای از کاراکترهاست. این کاراکترها
میتوانند حروف و اعداد معمولی، کاراکترهای خاص یا ترکیبی به هر مقدار تکرار
از هر دو باشند.
Modifiers:مشخص میکند که طبیق هر character set به چه تعداد باید انجام شود.
در سیستمهای یونیکسی میتوان با استفاده از ابزارهای زیر از عبارات منظم استفاده کرد:
vi sed grep csplit dbx dbxtool more ed expr lex pg nl rdist awk nawk egrep EMACS
anchor
در صورتی بخواهید جستوجوی الگو را در ابتدا، انتها یا دیگر مکانهای یک
خط انجام دهید باید از anchor استفاده کنید. به طوری که از کاراکتر ^ برای
مشخص کردن الگو در ابتدای خط و از $ برای تعیین الگو در انتهای خط استفاده
میشود .
مثال.
جدول زیر مثال خوبی است که طریقهی استفاده از کاراکترهای ^ و $ را نمایش میدهد.
^A : وقوع کاراکتر A در ابتدای خط A$ : وقوع کاراکتر A در انتهای خط A^ : وقوع عبارت "A^" در هر جای خط $A : وقوع عبارت "$A" در هر جای خط ^^ : وقوع ^ در ابتدای خط $$ : وقوع $ در انتهای خط
تعیین وقوع یک الگو در هرجای دلخواه از خط
در مثالهای قبل الگوهای مورد جستوجو تنها در ابتدا یا انتهای خط مورد
بررسی قرار میگرفتند. در بسیاری موارد شما نیاز دارید تا یک الگو در تمام
یک خط مورد جستوجو قرار دهید. برای اینمنظور از >\ در ابتدا و <\
در انتهای الگو استفاده میشود.
مثال.
برای جستوجوی عبارت the در هر جای دلخواه از یک خط میتوان از الگوی زیر استفاده نمود:
\<the\>
character sets
با استفاده از charaacter setها میتوان مجموعه از کاراکترها را به عنوان
یک الگو مشخص کرد. چندین راه برای مشخص یک الگو وجود دارد که به شرح زیر
هستند:
استفاده از رشتهای از حروف و اعداد
ساده ترین راه برای مشخص یک الگو استفاده از یک رشته است. به عنوان مثال رشتههای baroon ، other و ... نمایانگر یک الگو هستند.
مثال.
^baroon
استفاده از کاراکتر . (نقطه)
کاراکتر . (نقطه) یکی از کاراکترهای خاص است که به معنی «وقوع هر کاراکتر» به استثنای کاراکتر انتهای خط (n\) میباشد .
مثال.
^.$
تعیین محدودهای از کاراکترها با استفاده از کاراکترهای [ و ]
با استفاده از کاراکترهای [ و ] میتوان محدودهای از حروف (کوچک یا بزرگ) یا اعداد را به عنوان یک الگو تعیین کرد.
مثال.
الگوی زیر را در نظر بگیرید:
^T[a-z][aeiou][0-5]
این الگو بدین معنی است که حرف اول عبارتی که در ابتدای جمله آمده است باید
T و پس از آن یک حرف کوچک و بعد از آن یک حرف کوچک مصوت بیاید و در انتهای
الگو یک عدد بین صفر تا ۵ قرار داشته باشد.
استفاده از استانداردهای POSIX برای تعیین الگو
در عبارات منظم امکان استفاده از استانداردهای POSIX نیز وجود دارد. به
عنوان مثال بجای استفاده از [a-zA-z] میتوان از [:alpha:] استفاده کرد. در
صورتی که با این استانداردها آشنایی ندارید جدول زیر میتواند راهنمای خوبی
باشد:
[:alnum:] Alphanumeric [:cntrl:] Control Character [:lower:] Lower case character [:space:] Whitespace [:alpha:] Alphabetic [:digit:] Digit [:print:] Printable character [:upper:] Upper Case Character [:blank:] whitespace, tabe, etc. [:graph:] Printable and visible characters [:punct:] Puctuation [:xdigit:] Extended Digit
عدم وقوع برخی از کاراکترها
در برخی موارد شما نیاز دارید تا بجای تعیین محدودهای از کاراکترها
برای مشخص کردن الگو، وقوع محدودهای از آنها را نادیده بگیرید. برای
اینمنظور میتوان کاراکترهایی که نباید در نظر گرفته شوند را با استفاد از
^] در ابتدای محدوده و [ در انتهای محدوده مشخص کرد.
مثال.
[^-0-9]
که به معنی وقوع هر کاراکتری غیر از اعداد و کاراکتر – است.
تعیین تعداد وقوع هر الگو با استفاده از modifier ها
بخش سوم هر عبارت منظم تعیین تعداد تکرار هر الگو است. که در ادامه به بررسی راههای مشخص کردن تعداد تکرار از هر الگو میپردازیم:
استفاده از *
یکی از راههای تعیین تعداد تکرار الگو استفاده از کاراکتر * است. با
استفاده از این کاراکتر شما میتوانید تکرار صفر یا بیشتر از صفر برای هر
الگو را تعیین کنید.
مثال.
“^ *[0-9]”
این الگو عباراتی را در ابتدای خط در نظر میگیرد که با یک عدد آغاز میشوند.
همچنین در این مثال با چون از ”* ” استفاده شدهاست، تفاوتی نمیکند چه
مقدار فاصله از ابتدای خط وجود داشته باشد.
تعیین تعداد تکرار مشخص با استفاده از {\ و }\
با استفاده از کاراکترهای {\ و }\ میتوان تعداد تکرار یک الگو را به طور دقیق تعیین کرد.
مثال.
برای وقوع ۴، ۵، ۶، ۷ یا ۸ حرف کوچک در ابتدای خط میتوان از الگوی زیر استفاده کرد:
[a-z]\{4,8\}
چند مثال دیگر:
هر خطی که شامل یک * باشد:
*
هر خطی که شامل یک * باشد"
\*
هر خطی که شامل یک بک اسلش \ باشد:
\\
هر خطی که ابتدای آن * باشد:
^*
تمام خطوط:
^A*
تمامی خطوطی که با A* شروع میشوند:
^A\*
تمام خطوطی که با A شروع میشوند:
^AA*
هر خطی که ابتدای آن بیش از یک A و سپس در ادامه یک کاراکتر B وجود داشته باشد:
^AA*B
هر خطی که ابتدای آن ۴ الی ۸ کاراکتر A و سپس در ادامه یک کاراکتر B وجود داشته باشد:
^A\{4,8\}B
هر خطی که ابتدای بیش از ۴ کاراکتر A و سپس در ادامه یک کاراکتر B وجود داشته باشد:
^A\{4,\}B
هر خطی که ابتدای به صورت AAAAB باشد:
^A\{4\}B
هر خطی که شامل عبارت {4,8} باشد:
\{4,8\}
هر خطی که شامل عبارت {4,8}A باشد:
A{4,8}
نگهداری و تعیین تعداد تکرار الگو با استفاده از (\ )\ و 1\ و 2\ و ...
یکی از ویژگیهای دیگری که به هنگام استفاده از عبارات منظم باید مد نظر
قرار داد قابلیت نگهداری و تکرار یک کلمه یا عبارت خاص است. برای این
منظور شما به راهی برای ذخیره نتیجهی اولین الگوی پیدا شده و سپس مشخص
کردن تکرار آن نیاز دارید.
بدین منظور میتوانید قسمتی از الگو که نیاز به تکرار دارد را بااستفاده از
“(\” در ابتدا و “)\” در انتهای آن مشخص کرده و سپس با استفاده از یک عدد
تک رقمی تکرار آن را بهصورت n\ تعیین کنید.
مثال.
برای جستوجوی دو حرف برابر میتوان از عبارت زیر استفاده کرد:
"\([a-z]\)\1"
مثال.
برای جستوجوی یک عبارت ۵حرفی متقارن که فقط شامل حروف کوچک مبیاشد، میتوان از الگو به شکل زیر استفاده کرد:
\([a-z]\)\([a-z]\)[a-z]\2\1
منابع:
LPI Linux Certification in a Nutshell
[۱]
بارون ۱۲ مارس ۲۰۱۲، ساعت ۱۷:۴۶ (UTC)