Страницы

Поиск по вопросам

среда, 12 декабря 2018 г.

Поиск разных частей строки по регулярному выражению

Приведу сильно упрощенный пример. Есть строка str, допустим:
user=123456(somelogin)
Нужно получить идентификатор пользователя и его логин. Сейчас сделал так:
String id = str.replaceAll(".*user=(\\d+).*", "$1"); String name = str.replaceAll(".*user=\\d+\\((.*)\\).*", "$1");
Есть ли универсальный способ сделать это в одно действие, объединив 2 регулярки?
Возможно, так же красиво, как в языках с поддержкой кортежей или деструктуризации, не получится, но меня устроит вариант применения регулярки .*user=(\\d+)\\((.*)\\).* и получения на выходе массива строк, где первый элемент - первая группа, а второй - вторая.


Ответ

Можно воспользоваться связкой Pattern и Matcher. Решение будет не в одну строку, но зато по нему будет понятно, что вы что-то ищете в строке, а не заменой занимаетесь:
String str = "user=123456(somelogin)"; Pattern pattern = Pattern.compile(".*=(\\d+)\\((.*)\\)"); Matcher matcher = pattern.matcher(str); if (matcher.matches()) { String userId = matcher.group(1); String login = matcher.group(2); }

Регулярное выражение рассчитано на представленный пример строки. Если строка, на самом деле, может варьироваться сильнее, то нужно скорректировать рег. выражение. В частности, если в строке могут быть символы после логина (и закрывающей скобки), то нужно либо добавить .* в конец рег. выражения, либо отказаться от .* с обоих концов рег. выражения и метода matches в пользу метода find

Комментариев нет:

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