Попробуйте этот однострочник:
String positionStr = str.replaceAll("(?:(?!position:).)*(?:position:(\\d+))?.*", "$1");
Integer position = positionStr.isEmpty() ? null : new Integer(positionStr);
Это регулярное выражение соответствует всей строке, захватывает значение целевой позиции в группе 1 ((?:...)
- это группа без захвата) и заменяет совпадение ( ie все) с захваченной группой. Это эффективно удаляет все, что вы не хотите.
Удобно, потому что захват не является обязательным (имеет квантификатор ?
), если вход не имеют значение position:
, результатом является пустая строка.
Отрицательный прогноз (?!position:).
предотвращает прохождение точки мимо нашей цели. Без отрицательного просмотра вперед первая точка будет занимать весь ввод.