با سلام خدمت کاربران گرامی سایت پی وی لرن و کاربرانی که علاقمندان به دوره آموزشی پرل Perl. در جلسه گذشته علاقمندان به پرل کار با استاندارد های کد در پرل را فراگرفتند؛ در این جلسه نیز قرار است که آموزش کار با عبارات منظم در پرل را به شما ارائه نماییم.
پیش از شروع آموزش کار با عبارات منظم در پرل بهتر است که به ارائه تعرفی از ” عبارات منظم ” یا ” regular expression ” بپردازیم.
یک عبارت منظم یک رشته از کاراکترهایی است که الگوی یا الگوهایی را که مشاهده می کنید تعریف می کند.
سینتکس یک عبارت منظم در پرل بسیار شبیه سایر عبارت های منظم است و تفاوت چندانی با سایر این عبارات ها ندارد.
عبارات منظم پرل نیز از برنامه های مختلف نظیر sed, grep, و awk پشتیبانی می کند.
بهترین روش برای اجرای یک عبارت منظم استفاده از الگو اپراتور های binding است =~! and ~
اولین اپراتور یک اپراتور تست و تخصیص است.
سه اپراتور عبارات منظم در پرل وجود دارد.
خطوط رو به جلو در هر مورد بعنوان تعویض کننده برای عبارات منظم (regex) عمل می کنند.
اگر شما با هر یک از delimiter دیگر راحت هستید، می توانید از آن استفاده نمایید.
از اپراتور match برای انطباق یک رشته یا statement با یک عبارت منظم استفاده می شود.
برای مثال برای انطباق توالی “foo” با اسکالر bar$ می توانید از statement زیر استفاده نمایید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/usr/bin/perl $bar = "This is foo and again foo"; if ($bar =~ /foo/) { print "First time is matching\n"; } else { print "First time is not matching\n"; } $bar = "foo"; if ($bar =~ /foo/) { print "Second time is matching\n"; } else { print "Second time is not matching\n"; } |
با اجرای قطعه کد بالا، نتیجه ای به صورت زیر به دست خواهد آمد.
1 2 | First time is matching Second time is matching |
//m در واقع همانند توالی //q عمل می کند.
شما می توانید از هر ترکیبی از کاراکترهای مطابق با عنوان تعریف کننده برای اپراتور استفاده کنید.
m()،m {}m، و > <m همگی معتبر هستند. مثال بالا را می توان به صورت زیر نوشت:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/usr/bin/perl $bar = "This is foo and again foo"; if ($bar =~ m[foo]) { print "First time is matching\n"; } else { print "First time is not matching\n"; } $bar = "foo"; if ($bar =~ m{foo}) { print "Second time is matching\n"; } else { print "Second time is not matching\n"; } |
اگر delimiters ها رو به جلو هستند، می توانید m را از //m حذف کنید. اما برای دیگر delimiters باید از پیشوند m استفاده کرد.
توجه داشته باشید که کل عبارت match، یعنی عبارت سمت چپ = ~ یا ~! و اپراتور match، در صورتی که عبارت مطابقت داشته باشد مقدار true (در یک محدوده اسکالر) را بازگردانی می نماید.
بنابرین statement ما به شکل زیر خواهد بود.
1 | $true = ($foo =~ m/foo/); |
اگر foo$ fh با regex مطابق باشد و یا اگر مطابقت آن ها با یکدیگر صورت نگیرد در آن صورت true$ به ۱ تنظیم خواهد شد.
در محتوای یک لیست match محتوای هر عبارات گروهی را بازگردانی می نماید.
به عنوان مثال، هنگام استخراج ساعت ها، دقیقه ها و ثانیه ها از یک رشته زمان، می توان از آن استفاده کرد.
1 | my ($hours, $minutes, $seconds) = ($time =~ m/(\d+):(\d+):(\d+)/); |
در ادامه آموزش کار با عبارات منظم در پرل ویرایشگرهای اپراتور match را به شما معرفی می نماییم.
اپراتور match تعدادی ویرایشگر دارد که از آن ها پشتیبانی می نماید.
ویرایشگر g/ اجازه global matching را می دهد.
ویرایشگر i/ میزان حساسیت match را تعیین می کند.
در ادامه به معرفی تعدادی از این ویرایشگرها می پردازیم.
اپراتور ?PATTERN? یک نسخه ساده از اپراتور match است که تفاوت چندانی با اپراتور //m ندارد.
تنها تفاوت قابل ملاحظه این اپراتور با اپراتور //m این است که این اپراتور فقط با یک رشته که در جستجوی آن هستید برای باز نشانی مطابقت پیدا می کند.
به عنوان مثال، می توان از این اپراتور برای اولین و آخرین عناصر در یک لیست استفاده کرد.
1 2 3 4 5 6 7 8 9 | #!/usr/bin/perl @list = qw/food foosball subeo footnote terfoot canic footbrdige/; foreach (@list) { $first = $1 if /(foo.*?)/; $last = $1 if /(foo.*)/; } print "First: $first, Last: $last\n"; |
با اجرای قطعه کد بالا، نتیجه ای به صورت زیر به دست خواهد آمد.
1 | First: foo, Last: footbrdige |
متغیرهای عبارات منظم شامل $ می شود که حاوی آخرین انطباق های grouping match است.
&$ دیگر متغیر عبارت منظم است که حاوی تمام رشته های انطباق یافته است.
‘$ نیز از جمله این متغیرها است که شامل همه موارد البته قبل از انطباق رشته می باشد.
در کد زیر می توانید نتیجه را مشاهده نمایید.
1 2 3 4 5 6 7 | #!/usr/bin/perl $string = "The food is in the salad bar"; $string =~ m/foo/; print "Before: $`\n"; print "Matched: $&\n"; print "After: $'\n"; |
با اجرای قطعه کد بالا، نتیجه ای به صورت زیر به دست خواهد آمد.
1 2 3 | Before: The Matched: foo After: d is in the salad bar |
اپراتور جایگزینی ///s یکی از اکستنشن های اپراتور match است که اجازه می دهد متن خود را با یک متن جدید جایگزین نمایید.
فرم اصلی این اپراتور را در ادامه می بینید.
1 | s/PATTERN/REPLACEMENT/; |
PATTERN عبارت منظم متن است که دنبال آن می گردید.
علاوه بر این REPLACEMENT یک مشخصه برای متن یا عبارت منظم است که می خواهیم برای جایگزینی متن از آن استفاده کنیم.
برای مثال می توان همه رخداد های dog را در نمونه زیر با رخداد های cat با استفاده از عبارات منظم جایگزین کرد.
1 2 3 4 5 6 | #/user/bin/perl $string = "The cat sat on the mat"; $string =~ s/cat/dog/; print "$string\n"; |
با اجرای قطعه کد بالا، نتیجه ای به صورت زیر به دست خواهد آمد.
1 | The dog sat on the mat |
با معرفی و کار با ویرایشگر اپراتور جایگزینی، آموزش کار با عبارات منظم در پرل را ادامه می دهیم.
در ادامه می توانید لیستی از ویرایشگرهایی که در اپراتور جایگزینی به کار می روند را ببینید.
شماره ویرایشگر | توضیحات ویرایشگر و جزئیات آن |
۱ | i match ها را از حرکت باز می دارد. |
۲ | m مشخص می کند که اگر یک رشته حاوی newline و carriage باشد در آن صورت کاراکتر ها را بازگردانی می نماید. بعد از این اپراتور های ^ و $ به جای مرزهای یک رشته با مرز های یک newline مطابقت پیدا می کنند. |
۳ | o فقط یکبار اقدام به ارزیابی عبارت می کند. |
۴ | s اجازه استفاده از نقطه ( . ) را برای تطابق یک کاراکتر newline را میدهد. |
۵ | x برای ایجاد وضوح بیشتر اجازه استفاده از خطوط سفید را در عبارت می دهد. |
۶ | g همه رخدادهای بیان شده در یک متن را با یک دیگر متن جایگزین می کند. |
۷ | e یک جایگزینی یا replacement را همانند یک statement در پرل ارزیابی می نماید و از مقادیر بازگردانی شده همانند یک متن جایگزین شده استفاده می نماید. |
گرچه شباهت هایی بین اپراتور انتقال با اپراتور جایگزینی وجود دارد ولی این دو دقیقاً مشابه هم نیستند.
اپراتور انتقال برای جستجوی مقادیر جستجو از عبارات منظم استفاده نمی کند.
در ادامه می توانید یک نمونه از این اپراتور را مشاهده نمایید.
1 2 | tr/SEARCHLIST/REPLACEMENTLIST/cds y/SEARCHLIST/REPLACEMENTLIST/cds |
اپراتور انتقال تمام رخ داد های کاراکترهای SEARCHLIST را با کاراکترهای متناظر آن در REPLACEMENTLIST جایگزین می کند.
برای مثال در نمونه زیر ما از رشته “The cat sat on the mat” استفاده کرده ایم.
1 2 3 4 5 6 | #/user/bin/perl $string = 'The cat sat on the mat'; $string =~ tr/a/o/; print "$string\n"; |
با اجرای قطعه کد بالا، نتیجه ای به صورت زیر به دست خواهد آمد.
1 | The cot sot on the mot. |
می توان از محدوده های استاندارد های پرل نیز استفاده کرد، که به شما این امکان می دهد محدوده ی کاراکترها را با حروف یا عدد مشخص کنید.
اگر قصد تغییر مورد رشته را دارید؛ می توانید از سینتکس زیر در تابع uc استفاده نمایید.
1 | $string =~ tr/a-z/A-Z/; |
آموزش کار با عبارات منظم در پرل را با لیستی از ویرایشگرهای اپراتور انتقال ادامه می دهیم.
در ادامه می توانید لیستی از ویرایشگرهایی که در اپراتور انتقال به کار می روند را ببینید.
شماره ویرایشگر | توضیحات ویرایشگر و جزئیات آن |
۱ | c این ویرایشگر SEARCHLIST کامل می کند. |
۲ | d حذف کاراکترهای غیر قابل جایگزین. |
۳ | s این ویرایشگر کاراکترهای جایگزین شده تکراری را از بین می برد. |
ویرایشگر d/ کاراکترهایی را که با SEARCHLIST مطابقت دارند و علامت متناظر را در REPLACEMENTLIST ندارند، حذف می کند. به عنوان مثال :
1 2 3 4 5 6 | #!/usr/bin/perl $string = 'the cat sat on the mat.'; $string =~ tr/a-z/b/d; print "$string\n"; |
با اجرای قطعه کد بالا، نتیجه ای به صورت زیر به دست خواهد آمد.
1 | b b b. |
آخرین ویرایشگر یعنی /s توالی کپی شده از کاراکترهایی که جایگزین شده اند را حذف می کند، بنابراین :
1 2 3 4 5 6 7 | #!/usr/bin/perl $string = 'food'; $string = 'food'; $string =~ tr/a-z/a-z/s; print "$string\n"; |
با اجرای قطعه کد بالا، نتیجه ای به صورت زیر به دست خواهد آمد.
1 | fod |
آشنایی با عبارات منظم پیچیده موضوع بعدی است که در آموزش کار با عبارات منظم در پرل مطرح می شود.
عبارات منظم پیچیده به شما امکان می دهد که از انطباق با عبارات ساده فراتر روید و به یاری این قابیلت و به انطباق های پیچیده تری بپردازید.
در جدول زیر می توانید سینتکس عبارات پیچیده منظم را در پایتون ببینید.
شماره الگو | الگو و ویژگی ها و جزئیات آن |
۱ | ^ match شروع خط |
۲ | $ march پایان خط |
۳ | . این الگو هر کاراکتری را به جز newline مطابقت می دهد. این الگو با استفاده از آپشن m می تواند هر newline را انطباق دهد. |
۴ | […] هر کاراکتر تنهایی را در brackets انطباق می دهد. |
۵ | […^] هر کاراکتر تنهایی را که در brackets نیست انطباق می دهد. |
۶ | * تعداد ۰ رخداد یا بیشتر از رخداد های قبلی را انطباق می دهد. |
۷ | + تعداد ۱ رخداد یا بیشتر از رخداد های قبلی را انطباق می دهد. |
۸ | ? تعداد ۰ یا ۱ رخداد از رخداد های قبلی را انطباق می دهد. |
۹ | {n } تعدادn رخداد از رخداد های قبلی را انطباق می دهد. |
۱۰ | { ,n} تعداد n رخداد یا بیشتر از رخداد های قبلی را انطباق می دهد. |
۱۱ | {n,m} تعداد حداقل n رخداد از m رخداد از رخداد های قبلی را انطباق می دهد. |
۱۲ | a| b تعداد a یا b مقدار را انطباق می دهد. |
۱۳ | w\ کاراکتر های یک کلمه را مطابقت می دهد. |
۱۴ | W\ کاراکترهای بدون کلمه را مطابقت می دهد. |
۱۵ | s\ فضاهای خالی را مطابقت می دهد که معادل با [\t\n\r\f] |
۱۶ | S\ فضاهای غیر خالی را مطابقت می دهد. |
۱۷ | d\ ارقام را مطابق می دهد که معادل [۰-۹] است. |
۱۸ | D\ به انطباق مواردی که شامل ارقام نمی شوند می پردازد. |
۱۹ | A\ ابتدای یک رشته را انطباق می دهد. |
۲۰ | Z\ انتهای یک رشته را انطباق می دهد. این الگو در صورت وجود newline درست قبل از newline کار انطباق را انجام می دهد. |
۲۱ | z\ انتهای یک رشته را انطباق می دهد. |
۲۲ | G\ وقتی آخرین match یا انطباق به پایان رسید؛ نقطه آن را انطباق می دهد. |
۲۳ | b\ word boundaries را بیرون از brackets انطباق می دهد. و backspace ها را بیرون از brackets انطباق می دهد. |
۲۴ | B\ nonword boundaries ها را انطباق می دهد. |
۲۵ | .n, \t, etc\ newlines ها، carriage های بازگردانی شده، tabs ها و … را انطباق می دهد. |
۲۶ | ۹\…۱\ زیر عبارات nth grouped را انطباق می دهد. |
۲۷ | ۱۰\ زیر عبارات nth grouped را که در حال حاضر منطبق اند؛ انطباق می دهد. در غیر این صورت به ارجاع octal representation های کد های کاراکتر می پردازد. |
۲۸ | [aeiou] یک کاراکتر تکی را در یک مجموعه داده شده انطباق می دهد. |
۲۹ | [aeiou^] یک کاراکتر تکی را بیرون از یک مجموعه داده شده انطباق می دهد. |
metacharacter ^ با آغاز رشته مطابقت دارد و metasymbol $ با انتهای رشته منطبق است.
در اینجا چند نمونه مختصر را می توانید ببینید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # nothing in the string (start and end are adjacent) /^$/ # a three digits, each followed by a whitespace # character (eg "3 4 5 ") /(\d\s) {3}/ # matches a string in which every # odd-numbered letter is a (eg "abacadaf") /(a.)+/ # string starts with one or more digits /^\d+/ # string that ends with one or more digits /\d+$/ |
حالا به مثال زیر توجه نمایید.
1 2 3 4 5 6 | #!/usr/bin/perl $string = "Cats go Catatonic\nWhen given Catnip"; ($start) = ($string =~ /\A(.*?) /); @lines = $string =~ /^(.*?) /gm; print "First word: $start\n","Line starts: @lines\n"; |
با اجرای قطعه کد بالا، نتیجه ای به صورت زیر به دست خواهد آمد.
1 2 | First word: Cats Line starts: Cats When |
انطباق سازی Boundaries آخرین مبحثی است که در آموزش کار با عبارات منظم در پرل مطرح می شود.
b\ در هر word boundary به عنوان تعریف کننده کلاس w\ و کلاس W\ قابلیت انطباق دارد.
از آن جا که w\ شامل کاراکترهای یک کلمه و W\ مخالف آن است بنابرین بدین معناست که این کلمه به پایان رسیده است.
B\ نیز با هر چیزی که با word boundary نباشد انطباق ایجاد می کند.
برای مثال :
1 2 3 4 | /\bcat\b/ # Matches 'the cat sat' but not 'cat on the mat' /\Bcat\B/ # Matches 'verification' but not 'the cat on the mat' /\bcat\B/ # Matches 'catatonic' but not 'polecat' /\Bcat\b/ # Matches 'polecat' but not 'catatonic |
در این جلسه با آموزش کار با عبارات منظم در پرل با شما همراه بودیم.
در جلسه بعدی که آخرین جلسه از دوره آموزش پرل است شما را با نحوه ارسال ایمیل در پرل آشنا می نماییم.
با پی وی لرن همراه باشید.