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

  1. Что такое регулярное выражение
  2. Pattern и Matcher классы
  3. Основные мета символы
  4. Сравнение регулярного выражения с текстом
  5. Простой валидатор ссылки
  6. Регулярное выражение для проверки email
  7. Методы Pattern.split(), String.split()

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 включительно, и + означает «один или более» символов.

Рассмотрим пример нахождения регулярного выражения в тексте:

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]      Диапазон символов или цифр.

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

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

4. Сравнение регулярного выражения с текстом

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);
    }
}

5. Простой валидатор ссылки

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();
    }
}

6. Регулярное выражение для проверки email

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 = "адреса эл.почты:ivanov@gmail.com, sidorov@bsu.by!";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(s);
        while (matcher.find()) {
            System.out.println("e-mail: " + matcher.group());
        }
    }
}

7. Методы Pattern.split(), String.split()

Класс Pattern содержит метод split(), который разбивает строку на подстроки, используя указанный в шаблоне разделитель:

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));
    }
}

Класс String определяет такой же метод split():

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));
    }
}
Read also:
Trustpilot
Trustpilot
Comments