Руководство по Java. Регулярные выражения Java.

Регулярные выражения – это специальные последовательности символов, которые помогают нам находить строки или множества строк, используя специальные синтаксические шаблоны.

Регулярные выражения в Java обеспечиваются пакетом java.util.regex.

В пакете java.util.regex ключевыми являются 3 класса:

  • Matcher
    Этот класс интерпретирует шаблон и определяет совпадения в водимой строке.
  • Pattern
    Класс Pattern предоставляет нам скомпилированный вариант регулярного выражения.
  • PatternSyntaxException
    Этот класс предоставляет нам непроверяемые исключения, которые указывают нам на синтаксическую ошибку в нашем регулярном выражении.

Схватывающая группа

Схватывающая группа – это способ представить несколько символов, как единый элемент. Они создаются путём размещения символов внутри множества скобок. Например, слово (car) создаёт единую группу, которая состоит из букв “c”, “a” и “r”.

Для того чтобы понять, как это применяется на практике, рассмотрим пример простого приложения.

Пример:


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

public class CapturingGroupDemo {
    public static void main(String[] args) {
        String inputString = "This is simple that contains phone number +380505055050 That's great.";
        String pattern = "(\\d+)";

        Pattern ptrn = Pattern.compile(pattern);
        Matcher matcher = ptrn.matcher(inputString);

        if(matcher.find()){
            System.out.println("Phone number: " + matcher.group(0));
        }else {
            System.out.println("PHONE NUMBER NOT FOUND");
        }
    }
}

В результате работы программы мы получим такой результат:


/*Some system messages*/
Phone number: 380505055050

Здесь приведён крайне примитивный способ найти номер телефона в строке. На практике, для такой операции понадобиться более сложный шаблон, но в качестве примера нас устроит и такой вариант.

Как мы видим, мы применяем регулярное выражение \d, которое выводит числа (от 0 до 9). В результате программа опускает все нечисловые символы в строке и возвращает нам только номер телефона.

Ниже приведён список символов, которые мы можем использовать для регулярных выражений в языке программирования Java.

Таблица:

^ Совпадает начало строки
$ Совпадает конец строки
. Совпадают все символы, кроме символа новой строки.
[…] Совпадает любой отдельный символ в скобках.
[^…] Совпадает любой отдельный символ не в скобках.
\A Начало всей строки
\z Конец всей строки
\Z Конец всей строки, за исключением допустимого конечного конца строки.
re* Совпадает 0 или более вхождений предыдущего выражения.
re+ Совпадает 1 или более из предыдущих вещей.
re? Совпадает 0 или 1 вхождений предыдущего выражения.
re{ n} Совпадает n вхождений предыдущего выражения.
re{ n,} Совпадает n или более вхождений предыдущего выражения.
re{ n, m} Совпадает от n до m вхождений предыдущего выражения.
a| b Совпадает a или b.
(re) Группирует регулярные выражения и запоминает совпадающий текст.
(?: re) Группирует регулярные выражения без запоминания совпадающего текста.
(?> re) Совпадает независимый шаблон без возвратов.
\w Совпадает символ в слове.
\W Совпадает символ не в слове.
\s Совпадают пробелы.
\S Совпадают не пробелы.
\d Совпадают числа.
\D Совпадают не числа.
\G Соответствует точке, где заканчивается предыдущее совпадение.
\n Обратная ссылка для захвата числа n.
\b Совпадают границы слова за пределами скобок.
\B Совпадают границы не слова.
\n, \t, etc. Совпадают соответствующие символы (новая строка, возврат каретки и т.д.)
\Q Цитаты, до символа \Е
\E Конец цитаты \Q

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

В классе Matcher есть ряд методов, для определения места совпадения.

Вот эти методы:

  • public int start()
    Возвращает начальный индекс предыдущего совпадения.
  • public int start(int group)
    Возвращает начальный индекс подстроки, захваченной данной группой во время предыдущего совпадения.
  • public int end()
    Возвращает смещение после крайнего совпадающего символа.
  • public int end(int group)
    Возвращает смещение после крайнего символа подстроки, захваченного данной группой во время крайнего совпадения.

Методы поиска

Методы поиска предназначены для того, чтобы узнать есть ли во вводимой строке указанный шаблон (pattern).

Вот список методов поиска:

  • public boolean lookingAt()
    Ищет совпадения вводной строки и шаблона.
  • public boolean find()
    Ищет подстроку вводной строки, которая совпадает с шаблоном.
  • public boolean find(int start)
    Ищет подстроку вводной строки, которая совпадает с шаблоном начиная с указанного индекса.
  • public boolean matches()
    Ищет совпадения всей строки и шаблона.

Методы замещения

Для замещения текста во вводной строке в языке Java предусмотрены следующие методы:

  • public Matcher appendReplacement(StringBuffer sb, String replacement)
    Метод реализует объединение и замену строки.
  • public StringBuffer appendTail(StringBuffer sb)
    Метод реализует объединение и замену строки.
  • public String replaceAll(String replacement)
    Заменяет все подстроки вводной строки, которая совпадает с шаблоном, указанным во вводной строке.
  • public String replaceFirst(String replacement)
    Заменяет первую подстроку вводной строки, которая совпадает с шаблоном.
  • public static String quoteReplacement(String s)
    Этот метод возвращает литеральную замену стоки для указанной строки.

Для понимания того, как все эти методы работают на практике, рассмотрим примеры простых приложений.

Метод find()

Пример:


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

public class RegexFindMethodDemo {
    public static void main(String[] args) {
        String regularExpression = "\\bjava\\b";
        String inputString = "java java java2ee java";
        Pattern pattern = Pattern.compile(regularExpression);
        Matcher match = pattern.matcher(inputString);
        int matchCounter = 0;

        System.out.println("Now we will use method find()...");
        while (match.find()){
            matchCounter++;
            System.out.println("start(): "  + match.start());
            System.out.println("end(): " + match.end());
            System.out.println("Number of match: " + matchCounter);
        }
    }
}

В результате работы программы мы получим следующий результат:


/*Some system messages*/
Now we will use method find()...
start(): 0
end(): 4
Number of match: 1
start(): 5
end(): 9
Number of match: 2
start(): 18
end(): 22
Number of match: 3

Метод lookingAt()
Пример:


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

public class RegexLookingAtMethodDemo {
    public static void main(String[] args) {
        String regularExpression = "Java";
        String inputString = "Java Developer";
        Pattern pattern;
        Matcher match;

        pattern = Pattern.compile(regularExpression);
        match = pattern.matcher(inputString);

        System.out.println("Input string: " + inputString);
        System.out.println("Regular expression: " + regularExpression);

        System.out.println("Using method lookingAt(): " + match.lookingAt());
        System.out.println("Matches: " + match.matches());
    }
}

В результате работы программы мы получим следующий результат:


/*Some system messages*/
Input string: Java Developer
Regular expression: Java
Using method lookingAt(): true
Matches: false

Метод replaceAll()
Пример:


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

public class ReplaceFirstMethodDemo {
    public static void main(String[] args) {
        String regularExpression = "C#";
        String inputString = "C# is the most popular programming language in the world. You should learn C#.";
        String realSituation = "Java";

        Pattern pattern = Pattern.compile(regularExpression);
        Matcher match = pattern.matcher(inputString);

        System.out.println("Some people say:");
        System.out.println(inputString);

        inputString = match.replaceAll(realSituation);
        System.out.println("But frankly speaking:");
        System.out.println(inputString);
    }
}

В результате работы программы мы получим следующий результат:


/*Some system messages*/
Some people say:
C# is the most popular programming language in the world. You should learn C#.
But frankly speaking:
Java is the most popular programming language in the world. You should learn Java.

Метод appendReplacement()
Пример:


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

public class AppendReplacementMethodDemo {
    public static void main(String[] args) {
        String regularExpression = "bla";
        String inputString = "blablablaReallyblablablaImportantblablaInformationblabla";
        String replace = " ";

        System.out.println("Initial input string:");
        System.out.println(inputString);

        Pattern pattern = Pattern.compile(regularExpression);
        Matcher match = pattern.matcher(inputString);
        StringBuffer stringBuffer = new StringBuffer();

        while (match.find()){
            match.appendReplacement(stringBuffer, replace);
        }
        match.appendTail(stringBuffer);
        System.out.println("Final input string:");
        System.out.println(stringBuffer.toString());

    }
}

В результате работы программы мы получим следующий результат:


/*Some system messages*/
Initial input string:
blablablaReallyblablablaImportantblablaInformationblabla
Final input string:
   Really   Important  Information  

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

В следующем уроке мы более глубоко изучим, что такое методы и как они работают в языке программирования Java.