Рубрики

Квантификаторы в Java

Мы настоятельно рекомендуем ссылаться на этот пост ниже.

Регулярные выражения в Java

Квантификаторы позволяют пользователю указывать количество совпадений, с которыми сопоставлять. Ниже приведены некоторые часто используемые квантификаторы в Java.

X*        Zero or more occurrences of X
X?        Zero or One occurrences of X
X+        One or More occurrences of X
X{n}      Exactly n occurrences of X 
X{n, }    At-least n occurrences of X
X{n, m}   Count of occurrences of X is from n to m

Вышеприведенные квантификаторы можно сделать жадными, неохотными и притяжательными.

Жадный квантификатор (по умолчанию)
По умолчанию квантификаторы являются жадными. Жадные квантификаторы пытаются найти самый длинный текст, соответствующий заданному шаблону. Жадные квантификаторы работают, сначала читая всю строку, прежде чем пытаться сопоставить. Если весь текст не совпадает, удалите последний символ и повторите попытку, повторяя процесс, пока не будет найдено совпадение.

// Java-программа для демонстрации жадных квантификаторов

import java.util.regex.Matcher;

import java.util.regex.Pattern;

   

class Test

{

    public static void main(String[] args)

    {

        // Создание экземпляра класса Pattern

        // По умолчанию квантификатор "+" имеет значение Greedy

        Pattern p = Pattern.compile("g+");

   

        // Создание экземпляра класса Matcher

        Matcher m = p.matcher("ggg");

   

        while (m.find())

            System.out.println("Pattern found from " + m.start() +

                               " to " + (m.end()-1));

   

    }

}

Выход :

Pattern found from 0 to 2

Объяснение: Шаблон g + означает одно или несколько вхождений g . Текст GGG . Жадный сопоставитель будет соответствовать самому длинному тексту, даже если части соответствующего текста также совпадают. В этом примере g и gg также совпадают, но жадный сопоставитель производит ggg .

Неохотный квантификатор (добавление ? После квантификатора)
Этот квантификатор использует подход, противоположный жадным квантификаторам. Он начинается с первого символа и обрабатывает один символ за раз.

// Java-программа для демонстрации неохотных квантификаторов

import java.util.regex.Matcher;

import java.util.regex.Pattern;

   

class Test

{

    public static void main(String[] args)

    {

        // Создание экземпляра класса Pattern

        // Здесь "+" - квантификатор Reluctant, потому что

        // a "? ' добавляется после него.

        Pattern p = Pattern.compile("g+?");

   

        // Создание экземпляра класса Matcher

        Matcher m = p.matcher("ggg");

   

        while (m.find())

            System.out.println("Pattern found from " + m.start() +

                               " to " + (m.end()-1));

   

    }

}

Выход :

Pattern found from 0 to 0
Pattern found from 1 to 1
Pattern found from 2 to 2

Объяснение: Поскольку квантификатор неохотен, он сопоставляет самую короткую часть теста с шаблоном. Он обрабатывает один символ за раз.

Собственный квантификатор (добавление + после квантификатора)
Этот квантификатор сопоставляет столько символов, сколько ему может понравиться жадный квантификатор. Но если вся строка не совпадает, то она не пытается удалить символы с конца.

// Java-программа для демонстрации квантификаторов

import java.util.regex.Matcher;

import java.util.regex.Pattern;

   

class Test

{

    public static void main(String[] args)

    {

        // Создание экземпляра класса Pattern

        // Здесь "+" - это квантификатор Possessive, потому что

        // после него добавляется «+».

        Pattern p = Pattern.compile("g++");

   

        // Создание экземпляра класса Matcher

        Matcher m = p.matcher("ggg");

   

        while (m.find())

            System.out.println("Pattern found from " + m.start() +

                               " to " + (m.end()-1)); 

    }

}

Выход :

Pattern found from 0 to 2

Объяснение: Мы получаем тот же вывод, что и Greedy, потому что весь текст соответствует шаблону.

Ниже приведен пример, показывающий разницу между жадными и притяжательными квантификаторами.

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

import java.util.regex.Matcher;

import java.util.regex.Pattern;

   

class Test

{

    public static void main(String[] args)

    {

        // Создать шаблон с квантификатором Greedy

        Pattern pg = Pattern.compile("g+g");

  

        // Создать тот же шаблон с квантификатором притяжений

        Pattern pp = Pattern.compile("g++g");         

  

        System.out.println("Using Greedy Quantifier");

        Matcher mg = pg.matcher("ggg"); 

        while (mg.find())

            System.out.println("Pattern found from " + mg.start() +

                               " to " + (mg.end()-1)); 

  

        System.out.println("\nUsing Possessive Quantifier");

        Matcher mp = pp.matcher("ggg"); 

        while (mp.find())

            System.out.println("Pattern found from " + mp.start() +

                               " to " + (mp.end()-1)); 

  

    }

}

Выход :

Using Greedy Quantifier
Pattern found from 0 to 2

Using Possessive Quantifier

В приведенном выше примере, поскольку первый квантификатор является жадным, g + совпадает со всей строкой. Если мы сопоставляем g + со всей строкой, g + g не совпадает, квантификатор Greedy удаляет последний символ, сопоставляет gg с g + и находит совпадение.
В кванторе притяжений мы начинаем как жадный. g + соответствует всей строке, но соответствие g + всей строке не соответствует g + g с ggg . В отличие от Greedy, поскольку квантификатор является притяжательным, мы на этом остановимся.

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

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

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

Квантификаторы в Java

0.00 (0%) 0 votes