Регулярные выражения в Java? А почему бы и нет, как говорится. Время от времени неизбежно появляется необходимость их использовать, чтобы разбить строку на подстроки или, например, отформатировать данные. Сделать это можно несколькими разными способами.
Способ первый, он же самый простой, для несложных манипуляций - использовать встроенные методы класса String для работы с регулярными выражениями.
Пример 1.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. Проверка содержания строки.
boolean matched = data.matches(".+?code \\d+"); // true
Пример 1.3. Получение подстроки. Не совсем красивый способ, заставляющий прибегать к замене.
String exitCode = data.replaceFirst(".+?code (\\d+)", "$1"); // 0
Способ второй, он же более красивый и удобный - использование Pattern и Matcher из пакета java.util.regex.
Пример 2.1. Проверка содержания строки.
Pattern p = Pattern.compile(".+?code \\d+");
boolean matched = p.matcher(data).matches(); // true
Пример 2.2. Получение подстроки.
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. Проверка на содержание строки и получение подстрок.
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.
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

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