Страницы

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

понедельник, 30 декабря 2019 г.

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

#java #регулярные_выражения


Приведу сильно упрощенный пример. Есть строка str, допустим:

user=123456(somelogin)


Нужно получить идентификатор пользователя и его логин. Сейчас сделал так:

String id = str.replaceAll(".*user=(\\d+).*", "$1");
String name = str.replaceAll(".*user=\\d+\\((.*)\\).*", "$1");


Есть ли универсальный способ сделать это в одно действие, объединив 2 регулярки?

Возможно, так же красиво, как в языках с поддержкой кортежей или деструктуризации,
не получится, но меня устроит вариант применения регулярки .*user=(\\d+)\\((.*)\\).*
и получения на выходе массива строк, где первый элемент - первая группа, а второй - вторая.
    


Ответы

Ответ 1



Можно воспользоваться связкой 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.

Ответ 2



String str = "user=123456(somelogin)"; Matcher matcher = Pattern.compile(".*user=(\\d+)\\((.*)\\).*").matcher(str); if (matcher.find()) { System.out.println(matcher.group(1)); // 123456 System.out.println(matcher.group(2)); // somelogin }

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

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