Regex

Intro

Problem

  • Что если нам необходимо искать весьма специфические подстроки в тексте?

  • Что если нам необходимо проверить соответствие текста, какому-то шаблону?

Solution

  • Regular Expression

Disclaimer

В строках на Java спецсимволы регулярных выражений надо записывать с помощью экранирования.

Например:

  • \t\\t

  • \d\\d

  • ?\?

Regular Expression in String

matches(String): boolean`

String input = "+375221234567";
boolean result = input.matches("(\\+375)\\d{9}");
System.out.println(result);
true

split(String): String[]

String text = "Java.    Java?    Java         will never regret it!";
String[] words = text.split("\\s*(\\s|,|!|\\?|\\.)\\s*");
for (String word : words) {
    System.out.println(word);
}
Java
Java
Java
will
never
regret
it

replaceAll(String, String): String

String input = "Hello Java! Hello Javac! JavaSE 11.";
String myStr = input.replaceAll("Java(\\w*)", "HTML");
System.out.println(myStr);
Hello HTML! Hello HTML! HTML 11.

replaceFirst(String, String): String

String input = "Hello Java! Hello Javac! JavaSE 11.";
String myStr = input.replaceFirst("Java(\\w*)", "HTML");
System.out.println(myStr);
Hello HTML! Hello Javac! JavaSE 11.

Regular Expression with Pattern and Matcher

Pattern and Matcher

  • Более мощные средства, для работы с регулярными выражениями предлагают классы из пакета java.util.regex:

    • Pattern

    • Matcher

Pattern and Matcher

  • Класс Pattern служит для хранения регулярного выражения.

  • Класс Matcher служит для выполнения операций поиска и сравнения.

Pattern

Creating Pattern from Regular Expression

Для этого используется статический метод compile(String regex) класса Pattern

Pattern pattern = Pattern.compile("[ ,.!?]");

split(CharSequence): String[]

import java.util.regex.Pattern;

public class Example {
    public static void main(String[] args) {
        String input = "Hello Java! Hello Javac! JavaSE 11.";
        Pattern pattern = Pattern.compile("[ ,.!?]");
        String[] words = pattern.split(input);
        for (String word : words) {
            System.out.println(word);
        }
    }
}

Output

Hello
Java

Hello
Javac

JavaSE
11

matches(String, CharSequence): boolean

String text = "Hello Java! How are you?";
boolean isMatched = Pattern.matches("Hello.+", text);
System.out.println(isMatched);
true

matcher(String): Matcher

String text = "Hello Java! How are you?";
Matcher matcher = pattern.matcher("Hello.+");

Matcher

matches(): boolean

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

public class Example {
    public static void main(String[] args) {
        String text = "Hello Java! How are you?";
        Pattern pattern = Pattern.compile("Hello.+");
        Matcher matcher = pattern.matcher(text);
        boolean isMatched = matcher.matches();
        System.out.println(isMatched);
    }
}
true

lookingAt(): boolean

String text = "Hello Java! How are you?";
Pattern pattern = Pattern.compile("Hello");
Matcher matcher = pattern.matcher(text);
boolean isLookingAt = matcher.lookingAt();
System.out.println(isLookingAt);
true

replaceAll(String): String

String text = "Hello Java! Hello Javac! JavaSE 11.";
Pattern pattern = Pattern.compile("Java(\\w*)");
Matcher matcher = pattern.matcher(text);
String newStr = matcher.replaceAll("HTML");
System.out.println(newStr);
Hello HTML! Hello HTML! HTML 11.

find(): boolean

Метод ищет соответствие регулярному выражению в строке:

  • возвращает true, если соответствие найдено

  • false – если нет

find(): boolean

String text = "Hello Java! Hello Javac! JavaSE 11.";
Pattern pattern = Pattern.compile("Java(\\w*)");
Matcher matcher = pattern.matcher(text);
System.out.println(matcher.find());
true

start(): int and end(): int

Позицию найденного совпадения можно найти с помощью методов:

  • start()

  • end()

Pattern p = Pattern.compile(" +- +");
Matcher matcher = p.matcher("Test -    string -    test");
while (matcher.find()) {
    System.out.printf("[%d;%d)\n", matcher.start(), matcher.end());
}
[4;10)
[16;22)

group(): String

Чтобы узнать, как выглядит очередная найденная методом find(): boolean строка, можно использовать метод group(): String.

String input = "Hello Java! Hello Javac! JavaSE 11.";
Pattern pattern = Pattern.compile("Java(\\w*)");
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
    System.out.println(matcher.group());
}

group(): String

Java
Javac
JavaSE

group(): String

  • Часть регулярного выражения можно выделить в группу, для этого его следует взять в круглые скобки.

  • При нахождении соответствия, указав методу group() номер, начиная с единицы, можно получить не все соответствие, а только одну из его групп.

Pattern pattern = Pattern.compile("www\\.(\\w+)\\.com");
Matcher matcher = pattern.matcher("  www.rakovets.com        ");
boolean found = matcher.find();
if (found) {
    System.out.println(matcher.group(1));
}
rakovets

matcher.reset(String): Matcher

Если необходимо работать с новой строкой, то необязательно создавать новый объект класса Matcher, можно использовать метод reset().

String text = "Hello";
Pattern pattern = Pattern.compile("Hello");
Matcher matcher = pattern.matcher(text);
System.out.println(matcher.matches());
Matcher reset = matcher.reset("Hello Java! How are you?");
System.out.println(matcher.matches());

matcher.reset(String): Matcher

true
false