JavaRush /Java блог /Random UA /Зворотні посилання у регулярних виразах Java
eGarmin
41 рівень

Зворотні посилання у регулярних виразах Java

Стаття з групи Random UA
Зворотні посилання ( backreferences ) у регулярних виразах Java – дуже корисна можливість, підтримувана Java машиною. Щоб зрозуміти, що таке зворотні посилання, спочатку треба навчитися розуміти, що таке група ( group ). Група у регулярних виразах розглядає безліч символів як єдине ціле. Групи створюються поміщенням символів у круглі дужки – ”()”. Одна пара круглих дужок – одна група. Зворотні посилання зручні тим, що ми можемо повторювати пошукові патерни без їх безпосереднього копіювання. Нам досить просто послатися на раніше певну групу за допомогою конструкції виду \N , де N - це номер групи. Наступні 2 приклади дозволяють відчути зручність зворотних посилань.
Приклад 1: пошук патерну, що повторюється.
Конструкція виду (\d\d\d)\1 відповідає рядку 123123, але не рядку 123456. String str = "ля123123ля"; Pattern p = Pattern.compile("(\\d\\d\\d)\\1"); Matcher m = p.matcher(str); System.out.println(m.groupCount()); while (m.find()) { String word = m.group(); System.out.println(word + " " + m.start() + " " + m.end()); } Висновок: 1 123123 2 8 Примітка перекладача! Тут я, як перекладач, хочу проявити невелику вільність і вставити коментарі від себе, т.к. сам тільки знаюся на регулярних виразах і сподіваюся, що мене з матюгами:) виправлять, якщо те, що я напишу нижче, буде помилкою: 1) Метод groupCount () Видає кількість груп, заданих у патерні, тому навіть якщо вхідний рядок буде "ля123 456 ля", яка не вкладає в шаблон, на екран все одно буде виведена цифра 1. 2) Метод find() Шукає чергову групу, але повертає лише булевого значення: true – знайшов, false – не знайшов 3) Метод group() Повертає останню знайдену по патерну підрядок. В даному випадку 123123 4) Метод start() Повертає позицію знайденого підрядка у вихідному рядку (нумерація, зрозуміло, з нуля) 5) Метод end() Повертає позицію у вихідному рядку, що йде відразу за знайденим підрядком. Таким чином, це значення вказує не на останній символ зі знайденого підрядка у вихідному рядку, а на наступний за ним.
Приклад 2: Пошук повторюваних слів
String pattern = "\\b(\\w+)\\b[\\w\\W]*\\b\\1\\b"; Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE); String phrase = "unique is not duplicate but unique, Duplicate is duplicate."; Matcher m = p.matcher(phrase); while (m.find()) { String val = m.group(); System.out.println("Найденная последовательность символов: \"" + val + "\""); System.out.println("Слово-дубликат: " + m.group(1) + "\n"); } Висновок: Найденная последовательность символов: "unique is not duplicate but unique" Слово-дубликат: unique Найденная последовательность символов: "Duplicate is duplicate" Слово-дубликат: Duplicate Зверніть увагу, що такий спосіб знаходити слова, що повторюються (за допомогою регулярних виразів) не є оптимальним. Наприклад, у прикладі вище, перше слово duplicate пропускається.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ