JavaRush /وبلاگ جاوا /Random-FA /مبانی عبارات منظم در جاوا. قسمت 3
articles
مرحله

مبانی عبارات منظم در جاوا. قسمت 3

در گروه منتشر شد
بیایید مطالعه خود را در مورد عبارات منظم ادامه دهیم. در این مقاله به کلاس‌های کاراکتر از پیش تعریف‌شده و همچنین کمی‌سازی (جستجوی دنباله‌ها) خواهیم پرداخت. مبانی عبارات منظم در جاوا.  قسمت 3 - 1

کلاس های کاراکتر از پیش تعریف شده

کلاس API Patternشامل کلاس‌های کاراکتر از پیش تعریف‌شده است که میانبرهای مناسبی را برای عبارات معمولی استفاده می‌کنند. مبانی عبارات منظم در جاوا.  قسمت 3 - 2در این جدول، ساختارهای ستون سمت چپ، نمایش کوتاه عبارات در ستون سمت راست هستند. به عنوان مثال، \dبه معنای یک عدد (0-9)، \wبه معنای هر حرف بزرگ یا کوچک، خط زیر یا عدد است. در صورت امکان از کلاس های کاراکتر از پیش تعریف شده استفاده کنید. این کار باعث می شود کد شما راحت تر خوانده شود و خطاها برطرف شود. ساختارهایی که با بک اسلش شروع می شوند، فرار یا محافظت شده نامیده می شوند. \Qدر مقالات قبلی قبلاً در مورد فرار از کاراکترهای خاص با بک اسلش یا نمادها و \Eاستفاده از آنها به عنوان کاراکترهای معمولی صحبت کرده بودیم . اگر از بک اسلش با کاراکترهای معمولی (اللفظی) استفاده می کنید، باید از بک اسلش فرار کنید تا عبارت کامپایل شود.
private final String REGEX = "\\d"; // цифра
در این مثال \d، یک عبارت منظم؛ بک اسلش اضافی برای کامپایل شدن برنامه ضروری است. برنامه آزمایشی ما عبارات منظم را مستقیماً از کنسول می خواند، بنابراین نیازی به اسلش اضافی نیست. مثال زیر استفاده از کلاس‌های کاراکتر از پیش تعریف‌شده را نشان می‌دهد: مبانی عبارات منظم در جاوا.  قسمت 3 - 3مبانی عبارات منظم در جاوا.  قسمت 3 - 4در سه مثال اول، عبارت منظم به سادگی « .» (کاراکتر ویژه نقطه) است که به معنای هر کاراکتری است. بنابراین، جستجو در همه موارد موفقیت آمیز بود. نمونه های دیگر از کلاس های کاراکتر از پیش تعریف شده استفاده می کنند که معانی آن ها را در جدول بالا مورد بحث قرار دادیم.

کمیت کننده ها

مبانی عبارات منظم در جاوا.  قسمت 3 - 4کمیت کننده ها به شما امکان می دهند تعداد دفعات یک کاراکتر در یک رشته را مشخص کنید. بیایید نگاهی دقیق‌تر به پیچیدگی‌های نحوه عملکرد کمی‌سازهای حریص، تنبل و بسیار حریص بیندازیم. در نگاه اول ممکن است به نظر برسد که کمیت کننده های X?, X?? و X?+ به همین ترتیب کار می کنند: "X یک بار وجود دارد یا اصلا وجود ندارد." تفاوت های جزئی در اجرای این کمیت سازها وجود دارد که در ادامه به بررسی آنها می پردازیم.

طول صفر مطابقت دارد

بیایید با حریص شروع کنیم. بیایید سه عبارت منظم مختلف بنویسیم: حرف "a" با کاراکترهای خاص ?، * یا +. بیایید ببینیم اگر این عبارات منظم را در یک خط خالی آزمایش کنیم چه اتفاقی می‌افتد: مبانی عبارات منظم در جاوا.  قسمت 3 - 5در مثال بالا، جستجو در دو مورد اول موفقیت آمیز بود، زیرا عبارات a؟ و a* اجازه دهید کاراکتر a در رشته وجود نداشته باشد. همچنین توجه داشته باشید که شاخص شروع و آخرین مسابقه یکسان است (0). از آنجایی که رشته ورودی طولی ندارد، برنامه هیچ چیز :) را در موقعیت اول پیدا نمی کند. به این حالت تطابق با طول صفر می گویند. چنین تطابقی در چندین مورد رخ می دهد: وقتی خط ورودی خالی است، در ابتدای خط ورودی، بعد از آخرین کاراکتر خط، یا بین کاراکترهای خط. مسابقات صفر طول را به راحتی می توان تشخیص داد: آنها در یک موقعیت شروع و پایان می یابند. بیایید به چند نمونه دیگر از مسابقات با طول صفر نگاه کنیم. بیایید با چند مثال دیگر موارد منطبق با طول صفر را بررسی کنیم. بیایید رشته ورودی را به کاراکتر "a" تغییر دهیم و یک جلوه جالب مشاهده کنیم: مبانی عبارات منظم در جاوا.  قسمت 3 - 6هر سه کمی کننده کاراکتر "a" را پیدا کردند، اما دو عدد اول که امکان عدم وجود یک کاراکتر را فراهم می کند، یک تطابق با طول صفر در موقعیت 1 پیدا کردند. - بعد از آخرین کاراکتر رشته. این اتفاق می افتد زیرا برنامه با کاراکتر "a" به عنوان یک رشته برخورد می کند و تا زمانی که دیگر منطبق نباشد از آن عبور می کند. بسته به کمیت مورد استفاده، برنامه "هیچ" را در انتهای رشته پیدا خواهد کرد یا نخواهد یافت. حال بیایید رشته ورودی را به دنباله ای از پنج حرف "a" تغییر دهیم: مبانی عبارات منظم در جاوا.  قسمت 3 - 7عبارت منظم a؟ برای هر حرف در رشته به طور جداگانه یک تطابق پیدا می کند. عبارت a* دو تطابق پیدا می کند: دنباله کاراکتر "a" و تطابق با طول صفر در موقعیت 5. و در نهایت، عبارت منظم a+ فقط دنباله کاراکترهای "a" را پیدا می کند، بدون اینکه "هیچ چیز" را پیدا کند :) اگر رشته ای حاوی کاراکترهای مختلف به عنوان ورودی داده شود چه اتفاقی می افتد؟ به عنوان مثال، "ababaaab": مبانی عبارات منظم در جاوا.  قسمت 3 - 8کاراکتر "b" در موقعیت های 1، 3، و 8 قرار دارد و برنامه در این موقعیت ها مطابقت هایی با طول صفر پیدا می کند. عبارت منظم a؟ به «ب» توجهی نمی کند، بلکه صرفاً به دنبال حضور (یا عدم حضور) شخصیت «الف» است. اگر کمیت کننده اجازه عدم وجود "a" را بدهد، همه کاراکترهای رشته به غیر از "a" به عنوان یک مطابقت با طول صفر نشان داده می شوند. برای یافتن دنباله هایی با طول مشخص، به سادگی طول را در پرانتزهای فرفری مشخص کنید: مبانی عبارات منظم در جاوا.  قسمت 3 - 9عبارت منظم a{3} دنباله ای از سه کاراکتر "a" را جستجو می کند. هیچ چیزی در خط اول یافت نشد زیرا به اندازه کافی در خط وجود نداشت. دومی شامل 3 کاراکتر است که برنامه آنها را پیدا می کند. تست سوم نیز یک تطابق در ابتدای رشته پیدا می کند. هر چیزی که بعد از نویسه 3 باشد، عبارت منظم را برآورده نمی کند، در کد زیر آن را برآورده می کند و چندین تطابق وجود خواهد داشت: مبانی عبارات منظم در جاوا.  قسمت 3 - 10برای تعیین حداقل طول دنباله، از:
Enter your regex: a{3,}
Enter input string to search: aaaaaaaaa
I found the text "aaaaaaaaa" starting at index 0 and ending at index 9.
در این مثال، برنامه فقط یک تطابق پیدا می کند زیرا رشته حداقل طول دنباله مورد نیاز (3) کاراکتر "a" را برآورده می کند. در نهایت، تعیین حداکثر طول دنباله: مبانی عبارات منظم در جاوا.  قسمت 3 - 11در این مثال، اولین مسابقه بر روی کاراکتر ششم به پایان رسید. مسابقه دوم شامل کاراکترهای بعد از مورد ششم است، زیرا آنها حداقل طول مورد نیاز را برآورده می کنند. اگر رشته یک کاراکتر کوتاهتر بود، تطبیق دومی وجود نداشت.

استفاده از گروه ها و کلاس های کاراکتر با کمیت ساز

تا این مرحله، ما کمیت‌نماها را روی رشته‌هایی که دارای همان کاراکتر هستند آزمایش کرده‌ایم. کمیت‌کننده‌ها فقط برای یک کاراکتر اعمال می‌شوند، بنابراین عبارت منظم "abc+" رشته‌های حاوی "ab" و "c" را یک یا چند بار مطابقت می‌دهد. این یک یا چند بار به معنای "abc" نخواهد بود. اما کمیت‌کننده‌ها را می‌توان همراه با گروه‌ها و کلاس‌های کاراکتر استفاده کرد، مانند [abc]+ (a یا b یا c، یک یا چند بار) یا (abc)+ ("abc" یک یا چند بار). بیایید یک گروه از کاراکترها (سگ) را سه بار در یک خط پیدا کنیم: مبانی عبارات منظم در جاوا.  قسمت 3 - 12در مثال اول، برنامه مطابقت پیدا می کند، زیرا کمیت به گروهی از کاراکترها گسترش می یابد. اگر پرانتزها را بردارید، کمیت {3} فقط برای حرف "g" اعمال می شود. همچنین می توانید از کمیت سازها با کلاس های کاراکتر استفاده کنید: Основы регулярных выражений в Java. Часть 3 - 13کمیت {3} برای کلاس کاراکتر در پرانتز در مثال اول و در مورد دوم - فقط برای کاراکتر "c" اعمال می شود.

تفاوت بین کمیت کننده های حریص، تنبل و بیش از حد حریص

تفاوت های جزئی بین کمیت کننده های حریص، اکراه کننده و مالک وجود دارد. کمیت‌کننده‌های حریص به این دلیل نام‌گذاری شده‌اند که سعی می‌کنند طولانی‌ترین تطابق ممکن را پیدا کنند: برنامه ابتدا سعی می‌کند کل رشته را "خورد" کند، اگر مطابقت پیدا نشد، سپس یک کاراکتر کنار گذاشته می‌شود و جستجو تکرار می‌شود تا زمانی که مطابقت پیدا شود یا دیگر شخصیتی باقی نمی ماند از طرف دیگر، افراد تنبل از ابتدای خط شروع می کنند و شخصیت به شخصیت اضافه می کنند تا زمانی که مطابقت پیدا کنند. در نهایت، سنجش حسادانه کل رشته را یکبار اسکن می کند، بدون حذف کاراکترها مانند حریص. برای نمایش، از رشته xfooxxxxxxfoo استفاده می کنیم. Основы регулярных выражений в Java. Часть 3 - 14مثال اول از کمیت .* حریص برای یافتن هر کاراکتری، 0 یا بیشتر بار، و به دنبال آن کاراکترهای "f" "o" "o" استفاده می کند. از آنجایی که کانتیفایر حریص است، مطابق یافت شده شامل کل رشته است. یک کمیت حریص همه موارد منطبق را در یک رشته پیدا نمی کند زیرا در مرحله اول، پس از اسکن کل رشته، مطابقت پیدا می کند و کار را تمام می کند. مثال دوم تنبل است و از ابتدای خط شروع می شود و کاراکتر به کاراکتر اضافه می کند. برنامه با بررسی "خالی" شروع می شود، اما از آن زمان دنباله "foo" در ابتدای خط نیست، جستجو با افزودن کاراکتر "x" ادامه می یابد، پس از آن اولین تطابق بین شاخص های 0 و 4 پیدا می شود. جستجو تا پایان سطر ادامه دارد. و دومین تطابق بین شاخص های 4 و 13 پیدا می شود. مثال سوم تصادفی را پیدا نمی کند زیرا کمیت کننده حسادت دارد. در این مورد، عبارت منظم .*+ کل خط را می خورد و چیزی برای "foo" باقی نمی گذارد. هنگامی که نیاز دارید هر چیزی غیر ضروری را در یک رشته دور بیندازید از کمیت حسادت استفاده کنید، این کمیتگر معادل حریص موثرتر خواهد بود. همین! پیوند به منبع: مبانی عبارات منظم در جاوا. قسمت 3
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION