Рубрики

Regex Boundary Matchers в Java

Предварительные условия — Регулярные выражения в Java

Сопоставление границ может помочь нам определить, где в строке происходит совпадение. Вы можете сделать свои соответствия шаблону более точными, указав такую информацию с помощью сопоставителей границ. Например, может быть, вы заинтересованы в поиске конкретного слова, но только если оно появляется в начале или конце строки. Или, может быть, вы хотите знать, происходит ли совпадение на границе слова или в конце предыдущего совпадения.

Список граничных совпадений

  • ^ ставится перед словом для соответствия
  • $ помещается в конце слова для соответствия
  • / b Проверяет, начинается или заканчивается ли шаблон на границе слова
  • / B Соответствует выражению на несловесной границе
  • / A начало ввода
  • / G Требуется чтобы совпадение происходило только в конце предыдущего матча
  • / Z конец ввода, кроме конечного терминатора, если есть
  • / z конец ввода

Случай 1: сопоставление слова с ^ и $

  • ^ — соответствует началу строки
  • $ — соответствует концу.
  • Input : txt = "geeksforgeeks", regex = "^geeks"
    Output : Found from index 0 to 3
    Explanation : Note that the result doesn't include "geeks" after
                  "for" as we have used ^ in regex.
  • Input : txt = "geeksforgeeks", regex = "geeks$"
    Output : Found from index 8 to 13.
    Explanation : Note that the result doesn't include "geeks" before 
                 "for" as we have used $ in regex.
  • Input : txt = "geeksforgeeks", regex = "^geeks$"
    Output : No match found
    Explanation : The given regex would only matches with "geeks".
  • Input : txt = "  geeksforgeeks", regex = "^geeks"
    Output: No match found.
    Explanation : The input string contains extra whitespace at the beginning.
  • // Extra \ is used to escape one \
    Input : txt = "  geeksforgeeks", regex : "^\\s+geeks"
    Output: Found from index 0 to 6.
    Explanation : The pattern specifies geeks after one or more spaces.

// Java-программа для демонстрации того, что ^ соответствует началу
// строка, а $ соответствует концу.

import java.util.regex.Matcher;

import java.util.regex.Pattern;

  

class Reg

{

    public static void main(String[] args)

    {

        String txt = "geeksforgeeks";

  

        // Демонстрация ^

        String regex1 = "^geeks";

        Pattern pattern1 = Pattern.compile(regex1, Pattern.CASE_INSENSITIVE);

        Matcher matcher1 = pattern1.matcher(txt);

        while (matcher1.find())

        {

            System.out.println("Start index: " + matcher1.start());

            System.out.println("End index: " + matcher1.end());

        }

  

        // Демонстрация $

        String regex2 = "geeks$";

        Pattern pattern2 = Pattern.compile(regex2, Pattern.CASE_INSENSITIVE);

        Matcher matcher2 = pattern2.matcher(txt);

        while (matcher2.find())

        {

            System.out.println("\nStart index: " + matcher2.start());

            System.out.println("End index: " + matcher2.end());

        }

    }

}

Выход:

Start index: 0
End index: 5

Start index: 8
End index: 13

Случай 2: проверяет, начинается или заканчивается ли шаблон на границе слова, используя / b

  • Input: txt = "geeksforgeeks geekspractice", pat = "\\bgeeks"
    Output: Found from index 0 to 5 and from index 14 to 19
    Explanation : The pattern "geeks" is present at the beginning
                  of two words "geeksforgeeks" and "geekspractice"
    
  • Input: txt = "geeksforgeeks geekspractice", pat = "geeks\\b"
    Output: Found from index 8 to 13
    Explanation : The pattern "geeks" is present at the end of one
                  word "geeksforgeeks"
    

// Java-программа для демонстрации использования / b для соответствия
// регулярное выражение в начале и конце границы слова

import java.util.regex.Matcher;

import java.util.regex.Pattern;

  

class Reg

{

    public static void main(String[] args)

    {

        String txt = "geeksforgeeks geekspractice";

  

        // Демонстрация начала границы слова

        String regex1 = "\\bgeeks"; // Подходим в двух местах

        Pattern pattern1 = Pattern.compile(regex1, Pattern.CASE_INSENSITIVE);

        Matcher matcher1 = pattern1.matcher(txt);

        while (matcher1.find())

        {

            System.out.println("Start index: " + matcher1.start());

            System.out.println("End index: " + matcher1.end());

        }

  

        // Демонстрация окончания границы слова

        String regex2 = "geeks\\b"; // Подходим в одном месте

        Pattern pattern2 = Pattern.compile(regex2, Pattern.CASE_INSENSITIVE);

        Matcher matcher2 = pattern2.matcher(txt);

        while (matcher2.find())

        {

            System.out.println("\nStart index: " + matcher2.start());

            System.out.println("End index: " + matcher2.end());

        }

    }

}

Выход:

Start index: 0
End index: 5
Start index: 14
End index: 19

Start index: 8
End index: 13

Случай 3: сопоставить выражение на границе, отличной от слова, вместо этого использовать / B

  • Input: txt = "geeksforgeeks geekspractice", pat = "\\Bgeeks"
    Output: Found from index 8 to 13
    Explanation : One occurrence  of pattern "geeks" is not present at
                  the beginning of word which is end of "geeksforgeeks"
    
  • Input: txt = "geeksforgeeks geekspractice", pat = "geeks\\B"
    Output: Found from index 0 to 5 and from index 14 to 19
    Explanation : Two occurrences of "geeks" are not present at the end
                  of word.
    

// Java-программа для демонстрации использования / B для соответствия
// регулярное выражение в начале и в конце границы не слова

import java.util.regex.Matcher;

import java.util.regex.Pattern;

  

class Reg

{

    public static void main(String[] args)

    {

        String txt = "geeksforgeeks geekspractice";

  

        // Демонстрация Не начало слова

        String regex1 = "\\Bgeeks"; // Соответствует двум

        Pattern pattern1 = Pattern.compile(regex1, Pattern.CASE_INSENSITIVE);

        Matcher matcher1 = pattern1.matcher(txt);

        while (matcher1.find())

        {

            System.out.println("Start index: " + matcher1.start());

            System.out.println("End index: " + matcher1.end() + "\n");

        }

  

        // Демонстрация Не конец слова

        String regex2 = "geeks\\B"; // соответствует одному

        Pattern pattern2 = Pattern.compile(regex2, Pattern.CASE_INSENSITIVE);

        Matcher matcher2 = pattern2.matcher(txt);

        while (matcher2.find())

        {

            System.out.println("Start index: " + matcher2.start());

            System.out.println("End index: " + matcher2.end());

        }

    }

}

Выход:

Start index: 8
End index: 13

Start index: 0
End index: 5
Start index: 14
End index: 19

Случай 4: совпадение происходит только в конце предыдущего совпадения, используйте / G:

  • Input: txt = "geeksgeeks geeks", pat = "\\Ggeeks"
    Output: Found from index 0 to 5 and from 5 to 10
    Explanation : Only first two occurrences of "geeks" in text
                  match. the occurrence after space doesn't match
                  as it is not just after previous match.
    

// Java-программа для демонстрации использования / G для соответствия
// происходит только в конце предыдущего матча

import java.util.regex.Matcher;

import java.util.regex.Pattern;

  

class Reg

{

    public static void main(String[] args)

    {

        String txt = "geeksgeeks geeks";

  

        // Демонстрация / G

        String regex1 = "\\Ggeeks"; // Соответствует первым двум гикам

        Pattern pattern1 = Pattern.compile(regex1, Pattern.CASE_INSENSITIVE);

        Matcher matcher1 = pattern1.matcher(txt);

        while (matcher1.find())

        {

            System.out.println("Start index: " + matcher1.start());

            System.out.println("End index: " + matcher1.end());

        }

    }

}

Выход:

Start index: 0
End index: 5
Start index: 5
End index: 10

Ссылки: https://docs.oracle.com/javase/tutorial/essential/regex/bounds.html

Эта статья предоставлена Nishant Sharma . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Regex Boundary Matchers в Java

0.00 (0%) 0 votes