Вырезать слово или слова из строки после *паттерн*

К примеру у меня есть строка

CurrentlyPlaying(context=Context(type=PLAYLIST, href=https://api.spotify.com/v1/playlists/29GSd1GDp2VSxhUcz0pyzA, externalUrls=ExternalUrl(externalUrls={spotify=https://open.spotify.com/playlist/29GSd1GDp2VSxhUcz0pyzA}), uri=spotify:playlist:29GSd1GDp2VSxhUcz0pyzA), timestamp=1648062889952, progress_ms=170258, is_playing=true, item=Track(name=Rainbow In The Dark, artists=[ArtistSimplified(name=Dio)

Как из неё вырезать слово после artists=[ArtistSimplified(name= Чтобы получилось Dio?

Я пробовал что-то такое

    Pattern p = Pattern.compile("artists=[ArtistSimplified(name=");
    Matcher m = p.matcher(currentlyPlaying.toString());
    while (m.find()){
        i++;
    }
    // здесь substring по индексу i

но не получается и выдает 4 почему-то..


Ответы (1 шт):

Автор решения: Nowhere Man

Во-первых, в заданном шаблоне используются символы ( и [, которые нужно экранировать при помощи символа '\'. Во-вторых, не задана группа, которая определяла бы местонахождение имени исполнителя.

Следует изменить шаблон и вывод обнаруженного имени:

Pattern p = Pattern.compile("artists=\\[ArtistSimplified\\(name=([^)]*)\\)");
Matcher m = p.matcher(currentlyPlaying.toString());
while (m.find()){
    System.out.println(m.group(1)); // -> Dio
}

Также можно сразу искать название трека с использованием именованных групп (?<название_группы>шаблон):

// используются именованные группы
Pattern p = Pattern.compile("Track\\(name=(?<track>[^,)]*), artists=\\[ArtistSimplified\\(name=(?<artist>[^)]*)\\)");

Matcher m = p.matcher(currentlyPlaying.toString());

while (m.find()) {
    System.out.printf("'%s' by %s%n", m.group("track"), m.group("artist"));
}
// -> 'Rainbow In The Dark' by Dio
→ Ссылка