Подлинное преимущество, которое дает обработка регулярных выражений, невозможно ощуrить, не применяя метасимволы и кванторы. Рассмотрим сначала следующий пример, где квантор + применяется для сопоставления с любой произвольной последовательностью символов W:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// Применить квантор 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 любой длины.
1 2 3 |
Совпадение: W Совпадение: WW Совпадение: WWW |
В приведенном ниже примере программы метасимвол используется для составления шаблона, который должен сопоставляться с любой последовательностью, начинающейся с символа е и оканчивающейся символом d. Для этой цели в шаблоне указывается не только метасимвол точки, но и квантор +.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// Применить метасимвол и квантор 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()); } } |
Приведенный ниже результат выполнения этой программы может показаться неожиданным:
1 |
Совпадение: extend cup end |
При сопоставлении входной последовательности с шаблоном было обнаружено только одно совпадение. И это самая длинная последовательность, которая начинается с символа е и оканчивается символом d, хотя предполагалось обнаружить два совпадения: «extend» и «end«.
Более длинная последовательность была обнаружена потому, что по умолчанию метод find() обнаруживает совпадение с шаблоном самой длинной последовательности. Такое совпадение называется строгим.
Но можно задать и нестрогое совпадение, если ввести в шаблон квантор ? , как показано в приведенной ниже версии программы из предыдущего примера. В итоге получается шаблон для сопоставления с самой короткой входной последовательностью.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// Применить квантор ? 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()); } } |
Ниже приведены результаты, выводимые данной программой:
1 2 |
Совпадение: extend Совпадение: end |
Как следует из результатов, шаблон «е.+?d» совпадает с более короткой входной последовательностью, которая начинается с символа е и оканчивается символом d. Таким образом, обнаруживаются два совпадения.