بیایید مطالعه خود را در مورد عبارات منظم ادامه دهیم. در این مقاله به کلاسهای کاراکتر از پیش تعریفشده و همچنین کمیسازی (جستجوی دنبالهها) خواهیم پرداخت.
کلاس های کاراکتر از پیش تعریف شده
کلاس APIPattern
شامل کلاسهای کاراکتر از پیش تعریفشده است که میانبرهای مناسبی را برای عبارات معمولی استفاده میکنند. در این جدول، ساختارهای ستون سمت چپ، نمایش کوتاه عبارات در ستون سمت راست هستند. به عنوان مثال، \d
به معنای یک عدد (0-9)، \w
به معنای هر حرف بزرگ یا کوچک، خط زیر یا عدد است. در صورت امکان از کلاس های کاراکتر از پیش تعریف شده استفاده کنید. این کار باعث می شود کد شما راحت تر خوانده شود و خطاها برطرف شود. ساختارهایی که با بک اسلش شروع می شوند، فرار یا محافظت شده نامیده می شوند. \Q
در مقالات قبلی قبلاً در مورد فرار از کاراکترهای خاص با بک اسلش یا نمادها و \E
استفاده از آنها به عنوان کاراکترهای معمولی صحبت کرده بودیم . اگر از بک اسلش با کاراکترهای معمولی (اللفظی) استفاده می کنید، باید از بک اسلش فرار کنید تا عبارت کامپایل شود.
private final String REGEX = "\\d"; // цифра
در این مثال \d
، یک عبارت منظم؛ بک اسلش اضافی برای کامپایل شدن برنامه ضروری است. برنامه آزمایشی ما عبارات منظم را مستقیماً از کنسول می خواند، بنابراین نیازی به اسلش اضافی نیست. مثال زیر استفاده از کلاسهای کاراکتر از پیش تعریفشده را نشان میدهد: در سه مثال اول، عبارت منظم به سادگی « .
» (کاراکتر ویژه نقطه) است که به معنای هر کاراکتری است. بنابراین، جستجو در همه موارد موفقیت آمیز بود. نمونه های دیگر از کلاس های کاراکتر از پیش تعریف شده استفاده می کنند که معانی آن ها را در جدول بالا مورد بحث قرار دادیم.
کمیت کننده ها
کمیت کننده ها به شما امکان می دهند تعداد دفعات یک کاراکتر در یک رشته را مشخص کنید. بیایید نگاهی دقیقتر به پیچیدگیهای نحوه عملکرد کمیسازهای حریص، تنبل و بسیار حریص بیندازیم. در نگاه اول ممکن است به نظر برسد که کمیت کننده های X?, X?? و X?+ به همین ترتیب کار می کنند: "X یک بار وجود دارد یا اصلا وجود ندارد." تفاوت های جزئی در اجرای این کمیت سازها وجود دارد که در ادامه به بررسی آنها می پردازیم.طول صفر مطابقت دارد
بیایید با حریص شروع کنیم. بیایید سه عبارت منظم مختلف بنویسیم: حرف "a" با کاراکترهای خاص ?، * یا +. بیایید ببینیم اگر این عبارات منظم را در یک خط خالی آزمایش کنیم چه اتفاقی میافتد: در مثال بالا، جستجو در دو مورد اول موفقیت آمیز بود، زیرا عبارات a؟ و a* اجازه دهید کاراکتر a در رشته وجود نداشته باشد. همچنین توجه داشته باشید که شاخص شروع و آخرین مسابقه یکسان است (0). از آنجایی که رشته ورودی طولی ندارد، برنامه هیچ چیز :) را در موقعیت اول پیدا نمی کند. به این حالت تطابق با طول صفر می گویند. چنین تطابقی در چندین مورد رخ می دهد: وقتی خط ورودی خالی است، در ابتدای خط ورودی، بعد از آخرین کاراکتر خط، یا بین کاراکترهای خط. مسابقات صفر طول را به راحتی می توان تشخیص داد: آنها در یک موقعیت شروع و پایان می یابند. بیایید به چند نمونه دیگر از مسابقات با طول صفر نگاه کنیم. بیایید با چند مثال دیگر موارد منطبق با طول صفر را بررسی کنیم. بیایید رشته ورودی را به کاراکتر "a" تغییر دهیم و یک جلوه جالب مشاهده کنیم: هر سه کمی کننده کاراکتر "a" را پیدا کردند، اما دو عدد اول که امکان عدم وجود یک کاراکتر را فراهم می کند، یک تطابق با طول صفر در موقعیت 1 پیدا کردند. - بعد از آخرین کاراکتر رشته. این اتفاق می افتد زیرا برنامه با کاراکتر "a" به عنوان یک رشته برخورد می کند و تا زمانی که دیگر منطبق نباشد از آن عبور می کند. بسته به کمیت مورد استفاده، برنامه "هیچ" را در انتهای رشته پیدا خواهد کرد یا نخواهد یافت. حال بیایید رشته ورودی را به دنباله ای از پنج حرف "a" تغییر دهیم: عبارت منظم a؟ برای هر حرف در رشته به طور جداگانه یک تطابق پیدا می کند. عبارت a* دو تطابق پیدا می کند: دنباله کاراکتر "a" و تطابق با طول صفر در موقعیت 5. و در نهایت، عبارت منظم a+ فقط دنباله کاراکترهای "a" را پیدا می کند، بدون اینکه "هیچ چیز" را پیدا کند :) اگر رشته ای حاوی کاراکترهای مختلف به عنوان ورودی داده شود چه اتفاقی می افتد؟ به عنوان مثال، "ababaaab": کاراکتر "b" در موقعیت های 1، 3، و 8 قرار دارد و برنامه در این موقعیت ها مطابقت هایی با طول صفر پیدا می کند. عبارت منظم a؟ به «ب» توجهی نمی کند، بلکه صرفاً به دنبال حضور (یا عدم حضور) شخصیت «الف» است. اگر کمیت کننده اجازه عدم وجود "a" را بدهد، همه کاراکترهای رشته به غیر از "a" به عنوان یک مطابقت با طول صفر نشان داده می شوند. برای یافتن دنباله هایی با طول مشخص، به سادگی طول را در پرانتزهای فرفری مشخص کنید: عبارت منظم a{3} دنباله ای از سه کاراکتر "a" را جستجو می کند. هیچ چیزی در خط اول یافت نشد زیرا به اندازه کافی در خط وجود نداشت. دومی شامل 3 کاراکتر است که برنامه آنها را پیدا می کند. تست سوم نیز یک تطابق در ابتدای رشته پیدا می کند. هر چیزی که بعد از نویسه 3 باشد، عبارت منظم را برآورده نمی کند، در کد زیر آن را برآورده می کند و چندین تطابق وجود خواهد داشت: برای تعیین حداقل طول دنباله، از: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" را برآورده می کند. در نهایت، تعیین حداکثر طول دنباله: در این مثال، اولین مسابقه بر روی کاراکتر ششم به پایان رسید. مسابقه دوم شامل کاراکترهای بعد از مورد ششم است، زیرا آنها حداقل طول مورد نیاز را برآورده می کنند. اگر رشته یک کاراکتر کوتاهتر بود، تطبیق دومی وجود نداشت.
GO TO FULL VERSION