Как получить значение между () в строке Java непосредственно перед.? - PullRequest
1 голос
/ 07 октября 2019

Я должен заменить имя файла abc(1).jpg на abc(2).jpg. Вот код

 String example = "my attachements with some name (56).jpg";
 Matcher m = Pattern.compile("\\((\\d{1,}).\\)").matcher(example);
 int a = 0;
 while(m.find()) {
    a=Integer.parseInt(m.group(1));
String p = example.replace(String.valueOf(a), String.valueOf(a+1));
 }

Это работает в соответствии с данным вариантом использования. Но терпит неудачу в случае abc(ab)(1)(ab).jpg для этого случая это просто изменилось на abc(ab)(2)(ab).jpg. Что не требуется. Так, как я могу проверить, что числовая скобка находится перед точкой, т.е.

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Вы можете использовать

String example = "my attachements with some name (56).jpg";
Matcher m = Pattern.compile("(?<=\\()\\d+(?=\\)\\.)").matcher(example);
example = m.replaceAll(r -> String.valueOf(Integer.parseInt(m.group())+1) );
System.out.println( example );
// => my attachements with some name (57).jpg

См. Демонстрационную версию Java . Используемое регулярное выражение

(?<=\()\d+(?=\)\.)

См. Демонстрационную версию regex . Это соответствует

  • (?<=\() - местоположение, которому непосредственно предшествует (
  • \d+ - затем использует 1+ цифр
  • (?=\)\.) - сразу же следуетс ). последовательность символов.

Если вам нужно указать регулярному выражению совпадение с точкой, которая является последней точкой в ​​строке (где это, скорее всего, разделитель расширений), замените (?=\)\.) на(?=\)\.[^.]*$). Смотрите это регулярное выражение .

1 голос
/ 07 октября 2019

Для этого можно использовать регулярное выражение Lookahead:

"\\((\\d+)\\)(?=\\.)"

(?=\.) - это условие просмотра, которое подтверждает наличие точки сразу после закрытия )

RegEx Demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...