Приведу сильно упрощенный пример. Есть строка 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
Комментариев нет:
Отправить комментарий