Применение метасимволов и кванторов Java

Применение метасимволов и кванторов JavaПодлинное преимущество, которое дает обработка регулярных выражений, невозможно ощуrить, не применяя метасимволы и кванторы. Рассмотрим сначала следующий пример, где квантор + применяется для сопоставления с лю­бой произвольной последовательностью символов W:

//  

import java.util.regex.*;

public class RegExpr {

    public static void main(String[] args) {
        Pattern pat = Pattern.compile("W+");
        Matcher mat = pat.matcher("W WW WWW");
        
        while(mat.find())
            System.out.println(": " + mat.group());
    }

}

Ниже приведены результаты, выводимые данной программой. Как следует из результатов, шаблон "W+" в регулярном выражении совпадает с последовательно­стью символов W любой длины.

: W
: WW
: WWW

В приведенном ниже примере программы метасимвол используется для состав­ления шаблона, который должен сопоставляться с любой последовательностью, начинающейся с символа е и оканчивающейся символом d. Для этой цели в шабло­не указывается не только метасимвол точки, но и квантор +.

//    

import java.util.regex.*;

public class RegExpr {

    public static void main(String[] args) {
        Pattern pat = Pattern.compile("e.+d");
        Matcher mat = pat.matcher("extend cup end table");
        
        while(mat.find())
            System.out.println(": " + mat.group());
    }

}

Приведенный ниже результат выполнения этой программы может показаться неожиданным:

: extend cup end

При сопоставлении входной последовательности с шаблоном было обнаружено только одно совпадение. И это самая длинная последовательность, которая начи­нается с символа е и оканчивается символом d, хотя предполагалось обнаружить два совпадения: "extend" и "end".

Более длинная последовательность была обна­ружена потому, что по умолчанию метод find() обнаруживает совпадение с шабло­ном самой длинной последовательности. Такое совпадение называется строгим.

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

//   ?

import java.util.regex.*;

public class RegExpr {

    public static void main(String[] args) {
        Pattern pat = Pattern.compile("e.+?d");
        Matcher mat = pat.matcher("extend cup end table");
        
        while(mat.find())
            System.out.println(": " + mat.group());
    }

}

Ниже приведены результаты, выводимые данной программой:

: extend
: end

Как следует из результатов, шаблон "е.+?d" совпадает с более короткой вход­ной последовательностью, которая начинается с символа е и оканчивается симво­лом d. Таким образом, обнаруживаются два совпадения.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *