Урок 12

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

1. Что такое регулярное выражение

Регулярное выражение - это своего рода шаблон, который может быть применен к тексту.  Java предоставляет пакет java.util.regex для сопоставления с регулярными выражениями.

Регулярное выражение или соответствует тексту (его части) или нет. Если регулярное выражение совпадает с частью текста, то мы можем найти его. Если регулярное выражение составное, то мы можем легко выяснить, какая часть регулярного выражения совпадает с какой частью текста.

Например, есть следующая строка:

Используются файлы file1.doc, file2.txt.
А еще было бы неплохо обратить внимание на файл file3.img. 
Также просмотрите содержимое file4.doc.
Из строки нужно вырезать все имена файлов: file1.doc, file2.txt, file3.img, file4.doc. Для нахождения используется регулярное выражение:
[a-zA-Z]+\\.[a-z]{3}

Регулярное выражение "[a-z]+" соответствует всем строчным буквам в тексте. [a-z] означает любой символ от a до z включительно, и + означает «один или более» символов.

Пример 1. Нахождение регулярного выражения в тексте

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexDemo1 {
    public static void main(String[] args) {
        String stringPattern = "[a-z]+";
        String text = "code 2 learn java tutorial";
        Pattern pattern = Pattern.compile(stringPattern);
        Matcher matcher = pattern.matcher(text);
        while (matcher.find()) {
            System.out.println(text.substring(matcher.start(), matcher.end()));
        }
    }
}

2. Pattern и Matcher классы

Pattern класс - объект класса составляет представление регулярного выражения. Класс Pattern не предусматривает никаких публичных конструкторов. Чтобы создать шаблон, необходимо сначала вызвать один из публичных статических методов, которые затем возвращают объект класса Pattern. Эти методы принимают регулярное выражение в качестве аргумента.

Matcher класс - объект «Искатель» является двигателем, который интерпретирует шаблон и выполняет операции сопоставления с входной строкой. Как и Pattern класс, Matcher не имеет публичных конструкторов. Вы получаете объект Matcher вызовом метода matcher(), на объекте класса Pattern.

Методы класса Matcher:

  • matches() возвращает true, если шаблон соответствует всей строке, иначе false.
  • lookingAt() возвращает true, если шаблон соответствует началу строки, и false в противном случае.
  • find() возвращает true, если шаблон совпадает с любой частью текста.

3. Основные метасимволы

^       (крышка) начало проверяемой строки
$         (доллар) конец проверяемой строки
 .         (точка) представляет собой сокращенную форму записи для символьного класса, совпадающего с любым символом
|         означает «или». Подвыражения, объединенные этим способом, называются альтернативами (alternatives)
?       (знак вопроса) означает, что предшествующий ему символ является необязательным
+        обозначает «один или несколько экземпляров непосредственно предшествующего элемента
*      любое количество экземпляров элемента (в том числе и нулевое)
\\d    цифровой символ
\\D       не цифровой символ
\\s       пробельный символ
\\S      не пробельный символ
\\w      буквенный(латиница) или цифровой символ или знак подчёркивания
\\W     любой символ, кроме буквенного или цифрового символа или знака подчёркивания
[abc]      Диапазон символов или цифр

3. Примеры нахождения регулярных выражений

Примеры регулярных выражений:

a? - a один раз или ни разу
a* - a ноль или более раз
a+ - a один или более раз
a{n} - a n раз
a{n,}- a n или более раз
a{n,m}- a от n до m

Пример 2. Нахождение регулярного выражения в тексте

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexDemo2 {
    public static void main(String[] args) {
        Pattern pattern = Pattern.compile("a*b");
        Matcher matcher = pattern.matcher("aaab");
        boolean b = matcher.matches();
        System.out.println(b);
    }
}

Пример 3. Простой валидатор ссылки

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexDemo3 {
    public static void main(String[] args) {
        System.out.println(test("google.com"));
        System.out.println(test("reference1.ua"));
        System.out.println(test("reference1.org"));
    }

    public static boolean test(String testString) {
        Pattern pattern = Pattern.compile(".+\\.(com|ua|ru)");
        Matcher matcher = pattern.matcher(testString);
        return matcher.matches();
    }
}

Пример 4. Поиск и выбор подстроки, заданной шаблоном

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexDemo4 {
    public static void main(String[] args) {
        String regex = "(\\w{6,})@(\\w+\\.)([a-z]{2,4})";
        String s = "адреса эл.почты:blinov@gmail.com, romanchik@bsu.by!";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(s);
        while (matcher.find()) {
            System.out.println("e-mail: " + matcher.group());
        }
    }
}

Пример 5. Разбиение строки на подстроки с применением шаблона в качестве разделителя

import java.util.Arrays;
import java.util.regex.Pattern;

public class RegexDemo5 {
    public static void main(String[] args) {
        Pattern pattern = Pattern.compile("\\d+\\s?");
        String[] words = pattern.split("java5tiger 77 java6mustang");
        System.out.print(Arrays.toString(words));
    }
}

Пример 6. Разбиение строки на подстроки с применением шаблона в качестве разделителя

import java.util.Arrays;

public class RegexDemo6 {
    public static void main(String[] args) {
        String str = "java5tiger 77 java6mustang";
        String[] words = str.split("\\d+\\s?");
        System.out.print(Arrays.toString(words));
    }
}



0 comments
Leave your comment: