Регулярно выражаемся в Java

Регулярные выражения в Java? А почему бы и нет, как говорится. Время от времени неизбежно появляется необходимость их использовать, чтобы разбить строку на подстроки или, например, отформатировать данные. Сделать это можно несколькими разными способами.

Способ первый, он же самый простой, для несложных манипуляций - использовать встроенные методы класса String для работы с регулярными выражениями.

Пример 1.1. Разбивание строки на массив строк.

String data = "192.168.1.1; 127.0.0.1; 169.254.165.1";
String[] res = data.split(";\\s*");

В результате мы получим массив из трех строк: res[0] = 192.168.1.1, res[1] = 127.0.0.1, res[2] = 169.254.165.1.

Пример 1.2. Проверка содержания строки.

String data = "Process finished with exit code 0";
boolean matched = data.matches(".+?code \\d+");  // true

Пример 1.3. Получение подстроки. Не совсем красивый способ, заставляющий прибегать к замене.

String data = "Process finished with exit code 0";
String exitCode = data.replaceFirst(".+?code (\\d+)", "$1");  // 0


Способ второй, он же более красивый и удобный - использование Pattern и Matcher из пакета java.util.regex.

Пример 2.1. Проверка содержания строки.

String data = "Process finished with exit code 0";
Pattern p = Pattern.compile(".+?code \\d+");
boolean matched = p.matcher(data).matches();  // true

Пример 2.2. Получение подстроки.

Pattern p = Pattern.compile(".*?IP is 192\\.168\\.(\\d+)\\.(\\d+)");
Matcher m = p.matcher("Your IP is 192.168.1.30");
if (m.matches()) {
    String subnet = m.group(1);  // 1
    String machine = m.group(2);  // 30
}

Данный способ предоставляет более широкие возможности по использованию регулярных выражений. Также, если шаблон выражения используется более одного раза, напирмер, в цикле, Вы получите выигрыш во времени исполнении кода, если в начале скомпилируете шаблон используя p = Pattern.compile(), а затем подставляя p везде, где необходим данный шаблон.

Здесь считаю нужным также заметить, что первые два способа применяют шаблон ко всей строке, как если бы шаблон имел вид ^abc$. То есть "abc".matches("bc") = false. Способ третий не имеет данной особенности.


Способ третий, он же стильный и для более сложных замен - выражаемся в стиле Perl. Для этого используем класс Perl5Util из пакета org.apache.oro.text.perl.

Пример 3.1. Проверка на содержание строки и получение подстрок.

Perl5Util re = new Perl5Util();

if (re.match("m/IP is 192\\.168\\.(\\d+)\\.(\\d+)$/", "Your IP is 192.168.1.30")) {
    String subnet = re.group(1);  // 1
    String machine = re.group(2);  // 30
}

Пример 3.2. Замена строки в стиле Perl.

Perl5Util re = new Perl5Util();
String result = re.substitute("s/(\\d+\\.){3}(\\d+)$/127.0.0.$2/",
        "Your IP is 192.168.1.30");
System.out.println(result);  // 127.0.0.30

Отправить комментарий

Image CAPTCHA
Enter the characters shown in the image.
Реклама на stremoukhov.ru: