#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 }
Комментариев нет:
Отправить комментарий