تنبل (Lazy) کردن عبارات قاعده مند (Regular Expressions) (برعکس حالت پیش فرض حریص (Greedy) بودن)، به این معنی که در یک متن (عبارت خاص)، از بین یک عبارت کوتاه از آن متن و یک عبارت طولانی از آن متن، که هر دو در عبارت قاعده مند صدق می کنند (و البته تعدادی کاراکتر مشترک دارند)، عبارت کوتاه تر انتخاب شود، با علامت ? ، در عبارات قاعده مند (Regular Expressions)
در کلید شماره 782 در مورد مفهوم حریص (Greedy) بودن عبارات قاعده مند (Regular Expressions) صحبت کردیم و گفتیم که حریص (Greedy) بودن، به عنوان یک پیش فرض، در عبارات قاعده مند (Regular Expressions) وجود دارد. به این معنی که در یک متن (عبارت خاص)، از بین یک عبارت کوتاه از آن متن و یک عبارت طولانی از آن متن، که هر دو در عبارت قاعده مند (Regular Expressions) صدق می کنند (و البته تعدادی کاراکتر مشترک دارند)، عبارت طولانی تر انتخاب می شود. به همین دلیل است که اصطلاح حریص (Greedy) بودن برای این مفهوم انتخاب شده است، زیرا در اصطلاح می توان گفت که عبارات قاعده مند (Regular Expressions) برای یافتن عبارت های طولانی تر، حرص می زند.
اما شاید این پیش فرض برای عبارات قاعده مند (Regular Expressions)، مد نظر ما نباشد و بخواهیم که دقیقا برعکس آن را داشته باشیم، یعنی عبارت کوتاه تر انتخاب شود.
حالت برعکس حریص (Greedy) بودن را تنبل (Lazy) بودن عبارات قاعده مند (Regular Expressions) می نامند و برای اینکه یک عبارات قاعده مند (Regular Expressions) را از حالت پیش فرض حریص (Greedy) بودن (انتخاب عبارت طولانی تر) به حالت تنبل (Lazy) بودن (انتخاب عبارت کوتاه تر) تبدیل کنیم، باید علامت ? را به کار ببریم.
برای اینکه این مورد را به خوبی درک کنید، همان مثال های ارائه شده در کلید شماره 782 را این بار به همراه علامت ? ذکر می کنیم :
ابتدا حالت بدون استفاده از علامت ? را بیان می کنیم :
حالت پیش فرض حریص (Greedy) بودن (انتخاب عبارت طولانی تر) : بدون استفاده از علامت ?
عبارت قاعده مند (Regular Expressions) زیر را برای اشاره به تمامی عبارت های به شکل اعداد 5 رقمی تا 8 رقمی موجود در یک متن، می نویسیم ( کلید شماره 779 ) :
حال فرض کنید که در متن مورد نظرمان، عدد 8 رقمی زیر را داریم :
بنابراین هر یک از عبارت های زیر که از همه یا بخشی از ابتدای عبارت بالا به دست می آیند، در آن عبارت قاعده مند (Regular Expressions) صدق می کنند، اما تنها باید یکی به عنوان عبارت صدق کرده، انتخاب شود :
با توجه به مفهوم حریص (Greedy) بودن عبارات قاعده مند (Regular Expressions) (که به صورت پیش فرض وجود دارد)، طولانی ترین آنها، یعنی خود عدد 8 رقمی، به عنوان عبارت صدق کرده، انتخاب می شود :
بنابراین سایر عبارت ها که بر اساس چند رقم اول از ابتدای آن عدد 8 رقمی بودند، به دلیل کوتاه تر بودن، انتخاب نشدند.
حالت تنبل (Lazy) بودن (انتخاب عبارت کوتاه تر) : با استفاده از علامت ?
اکنون همان عبارت قاعده مند (Regular Expressions) را به همراه علامت ? به کار می بریم :
بنابراین اکنون برای عبارت قاعده مند (Regular Expressions)، به جای حالت پیش فرض حریص (Greedy) بودن (انتخاب عبارت طولانی تر)، حالت تنبل (Lazy) بودن (انتخاب عبارت کوتاه تر) را داریم. پس این دفعه عبارت زیر در عبارت قاعده مند (Regular Expressions) صدق می کند، زیرا کوتاه ترین عبارت می باشد :
ابتدا حالت بدون استفاده از علامت ? را بیان می کنیم :
حالت پیش فرض حریص (Greedy) بودن (انتخاب عبارت طولانی تر) : بدون استفاده از علامت ?
عبارت قاعده مند (Regular Expressions) زیر را برای اشاره به تمامی عبارت های به شکل عبارت های شامل کاراکترهای ساخت کلمه (Word Character) با تعداد کاراکتر دلخواه، موجود در یک متن، می نویسیم :
که در آن، عبارت w\ بیانگر یک مجموعه کاراکتر کوتاه (Shorthand Character Set) است ( کلید شماره 771 ) که شامل کاراکترهای ساخت کلمه (Word Character) که در زیر نشان داده ایم، می باشد :
کاربرد علامت + هم این است که امکان تکرار شدن کاراکتر (در اینجا، کاراکتری از کاراکترهای ساخت کلمه (Word Character)) را به وجود می آورد (به صورت حداقل 1 بار تکرار تا هر تعداد بار دلخواه) ( کلید شماره 3068 ).
حال فرض کنید که در متن مورد نظرمان، عبارت زیر را داریم :
بنابراین هر یک از عبارت های زیر که از همه یا بخشی از ابتدای عبارت بالا به دست می آیند، در آن عبارت قاعده مند (Regular Expressions) صدق می کنند، اما تنها باید یکی به عنوان عبارت صدق کرده، انتخاب شود :
اما سوال این است که کدامیک باید انتخاب شود ؟
با توجه به مفهوم حریص (Greedy) بودن عبارات قاعده مند (Regular Expressions) (که به صورت پیش فرض وجود دارد)، طولانی ترین آنها، یعنی خود عبارت kelidestan ، به عنوان عبارت صدق کرده، انتخاب می شود :
بنابراین سایر عبارت ها که بر اساس چند کاراکتر اول از ابتدای عبارت kelidestan بودند، به دلیل کوتاه تر بودن، انتخاب نشدند.
حالت تنبل (Lazy) بودن (انتخاب عبارت کوتاه تر) : با استفاده از علامت ?
اکنون همان عبارت قاعده مند (Regular Expressions) را به همراه علامت ? به کار می بریم :
بنابراین اکنون برای عبارت قاعده مند (Regular Expressions)، به جای حالت پیش فرض حریص (Greedy) بودن (انتخاب عبارت طولانی تر)، حالت تنبل (Lazy) بودن (انتخاب عبارت کوتاه تر) را داریم. پس این دفعه عبارت زیر در عبارت قاعده مند (Regular Expressions) صدق می کند، زیرا کوتاه ترین عبارت می باشد :
اما دقت کنید که در این حالت، بقیه عبارت kelidestan ، یعنی elidestan نیز شامل تک کاراکترهایی هستند که هر کدام به عنوان یک عبارت جداگانه می توانند در عبارت قاعده مند (Regular Expressions) تعیین شده، صدق کنند.
بنابراین عملا عبارت های زیر در عبارت قاعده مند (Regular Expressions) مورد نظر صدق می کنند :
خیلی عالی بود