در بخش قبلی دیدید که Quantifier ها چگونه به یک کاراکتر، کلاس کاراکتری یا گروه Capturing متصل میشوند. اما تا الان مفهوم گروههای Capturing را بهتفصیل بررسی نکردهایم.
گروههای Capturing روشی برای رفتار با چندین کاراکتر بهعنوان یک واحد واحد هستند. این گروهها با قرار دادن کاراکترهای مورد گروهبندی داخل پرانتزها ساخته میشوند. بهعنوان مثال عبارت باقاعده (dog) یک گروه واحد شامل حروف «d» «o» و «g» ایجاد میکند. بخش رشتهی ورودی که با گروه Capturing تطبیق مییابد، در حافظه ذخیره شده و بعداً از طریق Backreference قابل بازیابی است.
همانطور که در Pattern API ذکر شده، گروههای Capturing با شمارش پرانتزهای باز از چپ به راست شمارهگذاری میشوند. در عبارت ((A)(B(C))) چهار گروه وجود دارد:
((A)(B(C)))(A)(B(C))(C)برای فهمیدن تعداد گروههای موجود در عبارت، متد groupCount() را روی شیء Matcher فراخوانی کنید. این متد یک int نشاندهندهی تعداد گروههای Capturing در الگوی Matcher برمیگرداند. در این مثال، groupCount() عدد ۴ را برمیگرداند که نشان میدهد الگو شامل ۴ گروه Capturing است.
یک گروه خاص دیگر نیز وجود دارد، گروه ۰، که همیشه نمایانگر کل عبارت است. این گروه در مجموع گزارششده توسط groupCount() شامل نمیشود. گروههایی که با (? شروع میشوند، گروههای Non-Capturing خالص هستند که متن را Capturing نمیکنند و در مجموع گروهها شمرده نمیشوند.
درک نحوهی شمارهگذاری گروهها مهم است چون برخی متدهای Matcher یک int مشخصکنندهی شمارهی گروه خاص را بهعنوان پارامتر میپذیرند:
public int start(int group): ایندکس شروع زیردنبالهی Capturingشده توسط گروه مشخصشده در تطبیق قبلی را برمیگرداند.public int end(int group): ایندکس آخرین کاراکتر به اضافهی یک از زیردنبالهی Capturingشده توسط گروه مشخصشده در تطبیق قبلی را برمیگرداند.public String group(int group): زیردنبالهی ورودی Capturingشده توسط گروه مشخصشده در تطبیق قبلی را برمیگرداند.بخش رشتهی ورودی که با گروه(های) Capturing تطبیق مییابد، برای بازیابی بعدی از طریق Backreference در حافظه ذخیره میشود. Backreference در عبارت باقاعده با Backslash (\\) به دنبال یک رقم که شمارهی گروه مورد بازیابی را نشان میدهد مشخص میشود. بهعنوان مثال عبارت (\\d\\d) یک گروه Capturing تعریف میکند که دو رقم پشت سر هم را تطبیق میدهد که بعداً از طریق Backreference \\1 قابل بازیابی است.
برای تطبیق دو رقم، به دنبال دقیقاً همان دو رقم، از (\\d\\d)\\1 بهعنوان عبارت باقاعده استفاده کنید:
Enter your regex: (\d\d)\1
Enter input string to search: 1212
I found the text "1212" starting at index 0 and ending at index 4.
اگر دو رقم آخر را تغییر دهید، تطبیق ناموفق میشود:
Enter your regex: (\d\d)\1
Enter input string to search: 1234
No match found.
برای گروههای Capturing تو در تو، Backreferencing دقیقاً به همان شکل کار میکند: Backslash به دنبال شمارهی گروه مورد بازیابی مشخص کنید.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/