JavaRush /وبلاگ جاوا /Random-FA /RegEx: 20 گام کوتاه برای تسلط بر عبارات منظم. قسمت 4
Artur
مرحله
Tallinn

RegEx: 20 گام کوتاه برای تسلط بر عبارات منظم. قسمت 4

در گروه منتشر شد
RegEx: 20 گام کوتاه برای تسلط بر عبارات منظم. قسمت 1 RegEx: 20 گام کوتاه برای تسلط بر عبارات منظم. قسمت 2 20 گام کوتاه برای تسلط بر عبارات منظم. قسمت 3 این بخش پایانی، در وسط، مواردی را که عمدتاً توسط استادان بیان منظم استفاده می شود، لمس می کند. اما مطالب قسمت های قبلی برای شما آسان بود، درست است؟ این بدان معناست که شما می توانید این مواد را به همین راحتی اداره کنید! اصل اینجا RegEx: 20 گام کوتاه برای تسلط بر عبارات منظم.  قسمت 4 - 1 <h2>مرحله 16: گروه‌ها بدون ضبط (?:)</h2> RegEx: 20 گام کوتاه برای تسلط بر عبارات منظم.  قسمت 4 - 2در دو مثال در مرحله قبل، متنی را می‌گرفتیم که واقعاً به آن نیاز نداشتیم. در کار File Sizes، فاصله‌های قبل از اولین رقم اندازه فایل‌ها را می‌گرفتیم و در کار CSV، کاماهای بین هر نشانه را می‌گرفتیم. ما نیازی به گرفتن این شخصیت ها نداریم، اما باید از آنها برای ساختار بیان منظم خود استفاده کنیم. اینها گزینه های ایده آلی برای استفاده از یک گروه بدون گرفتن عکس هستند (?:). یک گروه غیرقابل جذب دقیقاً همان کاری را انجام می دهد که به نظر می رسد - به کاراکترها اجازه می دهد تا گروه بندی شوند و در عبارات منظم استفاده شوند، اما آنها را در یک گروه شماره گذاری نمی کند:
الگو: (?:")([^"]+)(?:") 
string: من فقط "متن داخل این نقل قول ها" را می خواهم .
مسابقات:             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
گروه:                 11111111111111111111111111    
( مثال ) اکنون عبارت منظم با متن نقل قول شده و همچنین خود کاراکترهای نقل قول مطابقت دارد، اما گروه ضبط فقط متن نقل قول را ضبط می کند. چرا باید این کار را انجام دهیم؟ نکته این است که اکثر موتورهای عبارات منظم به شما امکان می دهند متن را از گروه های ضبط تعریف شده در عبارات منظم خود بازیابی کنید. اگر بتوانیم کاراکترهای اضافی را که به آنها نیاز نداریم را بدون قرار دادن آنها در گروه‌های ضبط خود حذف کنیم، تجزیه و دستکاری متن بعداً آسان‌تر می‌شود. در اینجا نحوه پاکسازی تجزیه کننده CSV از مرحله قبل آمده است:
الگو: (?:^|،)\s*(?:\"([^",]*)\"|([^", ]*)) 
رشته:   a , " b ", " cd ", e , f , " gh ", dfgi ,, k , ", l 
مطابقت دارد: ^ ^ ^^^ ^ ^ ^^^ ^^^^ ^ ^ 
گروه:    2 1 111 2 2 111 2222 2 2    
( مثال(^|,) ) چند نکته وجود دارد که باید <mark>در اینجا به آنها توجه کرد:</mark> اول، از آنجایی که گروه ضبط کننده را به یک گروه غیرقابل تغییر تغییر دادیم، دیگر کاما نمی گیریم (?:^|,). دوم، ما گروه ضبط را در گروه غیر دستگیری تودرتو کردیم. این زمانی مفید است که، برای مثال، به گروهی از کاراکترها نیاز دارید تا به ترتیب خاصی ظاهر شوند، اما فقط به زیر مجموعه ای از آن شخصیت ها اهمیت می دهید. در مورد ما، به کاراکترهای غیر نقل قول و غیر ویرگول نیاز داشتیم [^",]*تا در نقل قول ظاهر شوند، اما در واقع به خود کاراکترهای نقل قول نیازی نداشتیم، بنابراین نیازی به گرفتن آنها نبود. در نهایت، <mark>توجه داشته باشید</mark> که در مثال بالا نیز یک تطابق با طول صفر بین کاراکترها kو l. نقل قول ها ""زیررشته های جستجو شده هستند، اما هیچ کاراکتری بین نقل قول ها وجود ندارد، بنابراین زیررشته منطبق شامل هیچ کاراکتری (طول صفر) نیست. <h3>آیا باید دانش خود را تثبیت کنیم؟ در اینجا دو کار و نیم وجود دارد که در این مورد به ما کمک می کند:</h3> با استفاده از گروه های غیرقابل ضبط (و گرفتن گروه ها، و کلاس های کاراکتر و غیره)، یک عبارت منظم بنویسید که فقط اندازه فایل های با فرمت مناسب را در خط ثبت کند. زیر:
الگو:
رشته:   6.6KB 1..3KB 12KB 5G 3.3MB KB .6.2TB 9MB .
مسابقات: ^^^^^ ^^^^^ ^^^^^^ ^^^^ 
گروه:    11111 1111 11111 111    
( راه حل ) تگ های باز کننده HTML با شروع <و پایان می یابند >. تگ های بسته شدن HTML با دنباله ای از کاراکترها شروع می شوند </و با کاراکتر به پایان می رسند >. نام تگ بین این کاراکترها وجود دارد. آیا می توانید یک عبارت منظم بنویسید تا فقط نام های موجود در تگ های زیر را ثبت کند؟ (شاید بتوانید این مشکل را بدون استفاده از گروه‌های غیر دستگیری حل کنید. سعی کنید این مشکل را به دو روش حل کنید! یک بار با گروه‌ها و یک بار بدون استفاده از گروه‌ها).
الگو:
رشته:   <p> </span> <div> </kbd> <link> 
مطابقت دارد: ^^^ ^^^^^^ ^^^^^ ^^^^^^ ^^^^^^ 
گروه:    1 1111 111 111 1111    
( راه‌حل با استفاده از گروه‌های غیرقابل جذب منجر به درد دل می‌شود، این مثال آخر یک نمونه خوب از یکی دیگر از ویژگی‌های مفید (گاهی) دیگر عبارات منظم است: ارجاعات به عقب. بک لینک ها مانند گروه های تکراری هستند که می توانید سعی کنید یک متن را دو بار بگیرید. اما آنها در یک جنبه مهم متفاوت هستند - آنها فقط همان متن را، شخصیت به شخصیت، ضبط می کنند. در حالی که یک گروه تکراری به ما امکان می دهد چیزی شبیه به این را بگیریم: \NRegEx: 20 گام کوتاه برای تسلط بر عبارات منظم.  قسمت 4 - 3
الگو: (he(?:[az])+) 
string:   heyabcdefg hey heyo heyellow heyyyyyyyyy 
matches: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^ 
گروه:    1111111111 111 1111 11111111 11111111111    
( مثال ) ... سپس بک لینک فقط با این مطابقت دارد:
الگو: (he([az])(\2+)) 
رشته: heyabcdefg hey heyo heyellow heyyyyyyyyy 
مسابقات:                              ^^^^^^^^^^^^ 
گروه:                                 11233333333    
( مثال ) تکرار گروه های ضبط زمانی مفید است که می خواهید یک الگوی مشابه را به طور مکرر مطابقت دهید، در حالی که بک لینک ها زمانی خوب هستند که می خواهید با متن مشابهی مطابقت داشته باشید. به عنوان مثال، می‌توانیم از یک بک لینک برای یافتن تگ‌های باز و بسته HTML منطبق استفاده کنیم:
الگو: <(\w+)[^>]*>[^<]+<\/\1> 
string:   <span style="color: red">هی</span> 
مطابقت دارد: ^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
گروه:    1111    
( مثال ) <mark>لطفاً توجه داشته باشید</mark> که این یک مثال بسیار ساده است و من قویاً توصیه می کنم که سعی نکنید تجزیه کننده HTML مبتنی بر عبارات منظم بنویسید. این نحو بسیار پیچیده است و به احتمال زیاد شما را بیمار می کند. گروه‌های کپچر نام‌گذاری شده بسیار شبیه به بک لینک‌ها هستند، بنابراین در اینجا به طور خلاصه به آن‌ها می‌پردازم. تنها تفاوت بین ارجاعات برگشتی و گروه ضبط نامگذاری شده در این است که ... یک گروه ضبط نامی دارای یک نام است:
الگو: <(?<tag>\w+)[^>]*>[^<]+<\/(?P=tag)></tag> 
string:   <span style="color: red">هی< /span> 
مسابقات: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
گروه:    1111    
( مثال ) می توانید با استفاده از نحو (?<name>...) یا (?'name'...) (عبارت منظم سازگار با NET) یا با این نحو (?P<name>) یک گروه ثبت نامی ایجاد کنید. ..) یا (?P'name'...) (عبارت منظم سازگار با پایتون). از آنجایی که ما از PCRE (Perl Compatible Regular Expression) استفاده می کنیم که از هر دو نسخه پشتیبانی می کند، می توانیم از هر کدام در اینجا استفاده کنیم. (جاوا 7 سینتکس دات نت را کپی کرد، اما فقط نسخه براکت های زاویه ای را کپی کرد. یادداشت مترجم) برای تکرار یک گروه ثبت نامی بعداً در یک عبارت معمولی، از \<kname> یا \k'name (.NET) یا (? P= نام) (Python). باز هم، PCRE از همه این گزینه های مختلف پشتیبانی می کند. می‌توانید در اینجا درباره گروه‌های ضبط نام‌گذاری شده بیشتر بخوانید ، اما این بیشتر چیزی بود که واقعاً باید در مورد آنها بدانید. <h3>وظیفه برای کمک به ما:</h3> از بک لینک استفاده کنید تا به من کمک کند تا به یاد بیاورم... اممم... نام این شخص.
الگو:
string: "سلام نام من جو است." [بعدا] "اسم آن پسر چیست؟ جو ؟"
مسابقات        _ ^ 
گروه:                  111    
( راه حل ) <h2>مرحله 18: نگاه به جلو و نگاه به عقب</h2> RegEx: 20 گام کوتاه برای تسلط بر عبارات منظم.  قسمت 4 - 4اکنون به برخی از ویژگی های پیشرفته عبارات منظم می پردازیم. من اغلب از همه چیز تا مرحله 16 استفاده می کنم. اما این چند مرحله آخر فقط برای افرادی است که از regex بسیار جدی برای مطابقت با عبارات بسیار پیچیده استفاده می کنند. به عبارت دیگر، استادان عبارات منظم. «نگاه به جلو» و «نگاه به عقب» ممکن است کاملاً پیچیده به نظر برسند، اما واقعاً چندان پیچیده نیستند. آنها به شما اجازه می‌دهند کاری مشابه آنچه قبلاً با گروه‌های غیرمجاز انجام دادیم انجام دهید - بررسی کنید که آیا متنی بلافاصله قبل یا بلافاصله بعد از متن واقعی وجود دارد که می‌خواهیم مطابقت دهیم. به عنوان مثال، فرض کنید می خواهیم فقط نام چیزهایی را که مردم دوست دارند مطابقت دهیم، اما فقط در صورتی که مشتاق آن باشند (فقط اگر جمله خود را با علامت تعجب تمام کنند). ما می توانیم کاری شبیه این انجام دهیم:
الگو: (\w+)(?=!) 
رشته: من میز کار را دوست دارم. من قدردان منگنه هستم. من عاشق لامپ هستم !
مسابقات:                                           ^^^^ 
گروه:                                              1111    
( مثال ) می توانید ببینید که چگونه گروه ضبط بالا (\w+)که معمولاً با هر یک از کلمات موجود در قسمت مطابقت دارد، فقط با کلمه لامپ مطابقت دارد. نگاه مثبت به آینده (?=!)به این معنی است که ما فقط می‌توانیم دنباله‌هایی را که به آخر می‌شوند مطابقت دهیم !، اما در واقع با خود کاراکتر علامت تعجب مطابقت نداریم. این یک تمایز مهم است، زیرا با گروه‌هایی که اسیر نمی‌شوند، شخصیت را تطبیق می‌دهیم، اما آن را تسخیر نمی‌کنیم. با نگاه‌ها و نگاه‌های پشت سر، از یک کاراکتر برای ساختن بیان منظم خود استفاده می‌کنیم، اما حتی آن را با خودش مطابقت نمی‌دهیم. بعداً می‌توانیم آن را در عبارت منظم خود مطابقت دهیم. چهار نوع نگاه و نگاه به پشت وجود دارد: نگاه مثبت (?=...)، نگاه منفی (؟!...)، نگاه مثبت (?<=...) و نگاه منفی (?<!. ..) . آن‌ها کاری را که به نظر می‌رسند انجام می‌دهند - نگاه مثبت و نگاه به عقب به موتور بیان منظم اجازه می‌دهند تا تنها زمانی تطبیق را ادامه دهد که متن موجود در چشم‌انداز/نگاه پشت واقعاً مطابقت داشته باشد. نگاه منفی و نگاه به عقب برعکس عمل می کنند - آنها به regex اجازه می دهند تنها زمانی مطابقت داشته باشد که متن موجود در lookahead/lookbehind مطابقت نداشته باشد. برای مثال، می‌خواهیم نام متدها را فقط در زنجیره‌ای از دنباله‌های متد تطبیق دهیم، نه شیئی که روی آن عمل می‌کنند. در این مورد، نام هر متد باید قبل از یک علامت باشد .. یک عبارت منظم با استفاده از یک نگاه ساده به عقب می تواند در اینجا کمک کند:
الگو: (?<=\.)(\w+) 
رشته: myArray. flatMap.aggregate.summarise.print !
مسابقات:         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
گروه:            1111111 111111111 111111111 11111    
( مثال ) در متن بالا، هر دنباله ای از کاراکترهای کلمه را مطابقت می دهیم \w+، اما فقط در صورتی که قبل از کاراکتر قرار گیرند .. ما می‌توانیم با استفاده از گروه‌های غیر اسیر به چیزی مشابه دست پیدا کنیم، اما نتیجه کمی آشفته‌تر است:
الگو: (?:\.)(\w+) 
رشته: myArray .flatMap.aggregate.summarise.print !
مسابقات:        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^ 
گروه:            1111111 111111111 111111111 11111    
( مثال ) اگرچه کوتاهتر است، اما با کاراکترهایی مطابقت دارد که ما به آنها نیاز نداریم. در حالی که این مثال ممکن است پیش پا افتاده به نظر برسد، اما نگاه به آینده و نگاه به عقب واقعا می تواند به ما کمک کند تا عبارات منظم خود را تمیز کنیم. <h3> خیلی کم تا پایان باقی مانده است! 2 کار زیر ما را 1 گام به آن نزدیکتر می کند:</h3> Negative lookbehind (?<!...) به موتور عبارات منظم اجازه می دهد فقط در صورتی به تلاش برای یافتن یک تطابق ادامه دهد که متن موجود در داخل lookbehind منفی وجود نداشته باشد. تا بقیه متن نمایش داده می شود که باید مطابقت با آن پیدا کنید. برای مثال، می‌توانیم از یک عبارت منظم استفاده کنیم تا فقط نام خانوادگی زنانی را که در یک کنفرانس شرکت می‌کنند مطابقت دهد. برای انجام این کار، می‌خواهیم مطمئن شویم که قبل از نام خانوادگی فرد یک علامت وجود ندارد Mr.. آیا می توانید یک عبارت منظم برای این بنویسید؟ (نام خانوادگی را می توان حداقل چهار کاراکتر فرض کرد.)
الگو:
رشته: آقای براون، خانم اسمیت ، خانم جونز ، خانم دیزی ، آقای سبز
مسابقات:                ^^^^^ ^^^^^ ^^^^^ 
گروه:                   11111 11111 11111    
( راه حل ) فرض کنید در حال پاکسازی یک پایگاه داده هستیم و ستونی از اطلاعات داریم که درصدها را نشان می دهد. متأسفانه برخی از افراد اعداد را به عنوان مقادیر اعشاری در محدوده [0.0، 1.0] می‌نوشتند، در حالی که برخی دیگر درصدها را در محدوده [0.0%، 100.0%] و برخی دیگر مقادیر درصد را می‌نوشتند، اما علامت درصد تحت اللفظی را فراموش کردند %. با استفاده از پیش بینی منفی (؟!...)، آیا می توانید فقط مقادیری را که باید درصد باشند، اما ارقام گم شده را علامت گذاری کنید %؟ اینها باید مقادیری کاملاً بزرگتر از 1.00 باشند، اما بدون دنباله %. (هیچ عددی نمی تواند بیش از دو رقم قبل یا بعد از نقطه اعشار داشته باشد.) <mark>توجه داشته باشید</mark> که این راه حل بسیار دشوار است . اگر بتوانید این مشکل را بدون نگاه کردن به پاسخ من حل کنید، پس در حال حاضر مهارت های زیادی در عبارات منظم دارید!
الگو:
رشته: 0.32 100.00 5.6 0.27 98% 12.2% 1.01 0.99% 0.99 13.13 1.10 
موارد منطبق: 
^^^^^^         ^^^ ^^^^      ^^^^^ ^^^^ ^^^^ 11111111111111111    
( راه حل ) <h2>مرحله 19: شرایط در عبارات منظم</h2> RegEx: 20 گام کوتاه برای تسلط بر عبارات منظم.  قسمت 4 - 5اکنون به نقطه ای رسیده ایم که اکثر مردم دیگر از عبارات منظم استفاده نمی کنند. ما احتمالاً 95 درصد موارد استفاده را برای عبارات منظم ساده پوشش داده‌ایم، و هر کاری که در مراحل 19 و 20 انجام می‌شود معمولاً توسط یک زبان دستکاری متن کامل‌تر مانند awk یا sed (یا یک زبان برنامه‌نویسی همه منظوره) انجام می‌شود. گفته شد، بیایید ادامه دهیم، فقط برای اینکه بدانید یک عبارت منظم واقعاً چه کاری می تواند انجام دهد. اگرچه عبارات منظم تورینگ کامل نیستند ، برخی از موتورهای عبارت منظم ویژگی هایی را ارائه می دهند که بسیار شبیه به یک زبان برنامه نویسی کامل هستند. یکی از این ویژگی ها «شرط» است. شرطی‌های Regex دستورهای if-then-else را می‌دهند، جایی که شاخه انتخابی با «نگاه به جلو» یا «نگاه به عقب» تعیین می‌شود که در مرحله قبل در مورد آن یاد گرفتیم. به عنوان مثال، ممکن است بخواهید فقط ورودی های معتبر را در لیستی از تاریخ ها مطابقت دهید:
الگو: (?<=Feb )([1-2][0-9])|(?<=مارس )([1-2][0-9]|3[0-1]) 
رشته: تاریخ های کار شده : 28 فوریه , 29 فوریه , 30 فوریه , 30 مارس , 31 مارس  
مسابقات:                   ^^ ^^ ^^ ^^ 
گروه:                      11 11 22 22    
( مثال ) <mark>توجه داشته باشید</mark> که گروه های فوق بر اساس ماه نیز نمایه می شوند. ما می‌توانیم یک عبارت منظم برای تمام 12 ماه بنویسیم و فقط تاریخ‌های معتبر را ضبط کنیم، که سپس در گروه‌هایی که براساس ماه سال فهرست‌بندی می‌شوند ترکیب می‌شوند. در بالا از نوعی ساختار اگر مانند استفاده می‌شود که فقط اگر «فوریه» قبل از یک عدد باشد (و به طور مشابه برای گروه دوم) به دنبال موارد مشابه در گروه اول می‌گردد. اما اگر بخواهیم فقط برای فوریه از پردازش ویژه استفاده کنیم، چه؟ چیزی مانند "اگر شماره قبل از "بهمن" است، این کار را انجام دهید، در غیر این صورت این کار را انجام دهید." در اینجا نحوه انجام مشروط این است:
الگو: (?(?<=Feb )([1-2][0-9])|([1-2][0-9]|3[0-1])) 
رشته: تاریخ کار: 28 فوریه , 29 فوریه , 30 فوریه, 30 مارس , 31 مارس  
مسابقات:                   ^^ ^^ ^^ ^^ 
گروه:                      11 11 22 22    
( مثال ) ساختار if-then-else شبیه (?(If)then|else است، که در آن (if) با "نگاه به جلو" یا "نگاه به عقب" جایگزین می شود. در مثال بالا، (if) به صورت نوشته شده است (?<=Feb). می بینید که ما تاریخ های بزرگتر از 29 را مطابقت دادیم، اما به شرطی که از "فوریه" پیروی نکرده باشند. استفاده از lookbehind در عبارات شرطی مفید است اگر می خواهید مطمئن شوید که تطابق با مقداری متن پیش از آن است. شرط‌های پیش‌بینی مثبت می‌توانند گیج‌کننده باشند، زیرا خود شرط با هیچ متنی مطابقت ندارد. بنابراین اگر می خواهید شرط if همیشه مقداری داشته باشد، باید با lookahead مانند زیر قابل مقایسه باشد:
الگو: (?(?=دقیق)دقیق|دیگر) رشته wo 
: exact other exactwo otherwo  
match:            ^^^^^^^ ^^^^^^
( مثال ) این بدان معنی است که شرط های مثبت پیش بینی بی فایده هستند. شما بررسی می‌کنید که آیا آن متن در جلو است یا خیر و سپس یک الگوی منطبق ارائه می‌کنید تا در صورت وجود آن دنبال شود. عبارت شرطی در اینجا به هیچ وجه به ما کمک نمی کند. همچنین می‌توانید عبارت بالا را با یک عبارت منظم ساده‌تر جایگزین کنید:
الگو: (?:exact|دیگر) wo 
string: exact other exactwo otherwo  
matchs:            ^^^^^^^ ^^^^^^
( مثال ) بنابراین، قاعده کلی برای عبارات شرطی این است: تست، تست، و دوباره تست کنید. در غیر این صورت، راه‌حل‌هایی که فکر می‌کنید بدیهی هستند به هیجان‌انگیزترین و غیرمنتظره‌ترین راه‌ها شکست خواهند خورد :) <h3>در اینجا به آخرین بلوک کارها می‌رسیم که ما را از آخرین مرحله بیستم جدا می‌کند:</h3> یک عبارت منظم بنویسید که از عبارت شرطی lookahead منفی برای آزمایش اینکه آیا کلمه بعدی با حرف بزرگ شروع می شود استفاده می کند. اگر چنین است، فقط یک حرف بزرگ و سپس حروف کوچک بگیرید. اگر اینطور نیست، هر کاراکتر کلمه را بگیرید.
الگو:
رشته:   Jones Smith 9sfjn Hobbes 23r4tgr9h CSV Csv vVv 
مطابقت: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
گروه:    22222 22222 11111 222222 111111111 222 111    
( راه حل ) در پشت عبارت شرطی یک نگاه منفی بنویسید که متن را ownsفقط در صورتی ضبط کند که قبل از آن متن نباشد clو oudsفقط زمانی که متن قبل از آن متن باشد cl. (مثال کمی ساختگی است، اما چه کاری می توانید انجام دهید...)
الگو:
رشته: آن دلقک ها صاحب چند کلاه هستند . عود
مسابقات:              ^^^^ ^^^^   
( راه حل ) <h2>مرحله 20: بازگشت و مطالعه بیشتر</h2> RegEx: 20 گام کوتاه برای تسلط بر عبارات منظم.  قسمت 4 - 6در واقع، چیزهای زیادی وجود دارد که می توان در یک مقدمه 20 مرحله ای برای هر موضوعی فشرده کرد و عبارات منظم نیز از این قاعده مستثنی نیستند. پیاده سازی ها و استانداردهای مختلفی برای عبارات منظم وجود دارد که در اینترنت یافت می شوند. اگر می‌خواهید بیشتر بدانید، پیشنهاد می‌کنم سایت فوق‌العاده regularexpressions.info را ببینید ، این یک مرجع فوق‌العاده است و من مطمئناً چیزهای زیادی در مورد عبارات منظم از آنجا یاد گرفتم. من آن را و همچنین regex101.com را برای آزمایش و انتشار آثار شما به شدت توصیه می کنم. در این مرحله آخر، من اطلاعات کمی در مورد عبارات منظم، یعنی نحوه نوشتن عبارات بازگشتی به شما می دهم. بازگشت‌های ساده بسیار ساده هستند، اما بیایید به معنای آن در زمینه یک عبارت منظم فکر کنیم. نحو برای بازگشت ساده در یک عبارت منظم به این صورت نوشته می شود: (?R)?. اما، البته، این نحو باید در خود عبارت ظاهر شود. کاری که ما انجام خواهیم داد این است که عبارت را به تعداد دلخواه در درون خودش قرار دهیم. مثلا:
الگو: (hey(?R)?oh) 
string:   heyoh heyyoh heyheyohoh هی اوه هی هی هی هیهههه  
مسابقات: ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
گروه:    11111 1111111111 1111111111    
( مثال ) از آنجایی که عبارت تودرتو اختیاری است ( (?R)دنبال می شود ?)، ساده ترین تطابق این است که به سادگی از بازگشت به طور کامل چشم پوشی کنیم. بنابراین،، heyو سپس ohمطابقت ( heyoh). برای تطبیق هر عبارت پیچیده‌تری از این، باید آن زیررشته منطبق را در نقطه‌ای از عبارت که (?R)دنباله را درج کرده‌ایم تودرتو پیدا کنیم. به عبارت دیگر، ما می توانیم هیهیوهه یا هی هی هیووهو و غیره را پیدا کنیم. یکی از خوبی‌های این عبارات تودرتو این است که برخلاف ارجاع‌های برگشتی و گروه‌های ثبت نام‌شده، شما را به متن دقیقی که قبلاً مطابقت داده‌اید، کاراکتر به کاراکتر محدود نمی‌کنند. مثلا:
الگو: ([Hh][Ee][Yy](?R)?oh) 
string:   heyoh heyyoh hEyHeYohoh هی اوه هی هی هی hEyHeYHEyohohoh  
مطابقت دارد: ^^^^^ ^^^^^^^^^ ^^^^^ ^^^^^^^^^^ 
گروه:    11111 1111111111 111111111111111    
( مثال ) می توانید تصور کنید که موتور عبارات منظم به معنای واقعی کلمه عبارت منظم شما را تعداد دلخواه بارها کپی و جایگذاری می کند. البته، این بدان معناست که گاهی اوقات ممکن است آن چیزی که شما انتظار داشتید را انجام ندهد:
الگو: ((?:\(\*)[^*)]*(?R)?(?:\*\))) 
رشته: (* نظر (* تو در تو *) نه *)
مسابقات:            ^^^^^^^^^^^^ 
گروه:               111111111111    
( مثال ) آیا می توانید بگویید چرا این regex فقط کامنت تودرتو را ثبت می کند و کامنت بیرونی را نمی گیرد؟ یک چیز مطمئن است: هنگام نوشتن عبارات منظم پیچیده، همیشه آنها را آزمایش کنید تا مطمئن شوید که همانطور که فکر می کنید کار می کنند. این رالی پر سرعت در امتداد جاده های بیان منظم به پایان رسیده است. امیدوارم از این سفر لذت برده باشید. خوب، و در نهایت، همانطور که در ابتدا قول داده بودم، چندین پیوند مفید را برای مطالعه عمیق تر مطالب در اینجا می گذارم:
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION