groupValues ​​возвращает только последнее появление повторяющегося шаблона

println(Regex("(A|B)+").matchEntire("AB")!!.groupValues) 

печатает [AB, B] но я ожидал, что результатом будет [AB, A, B] .

  • Ожидается ли такое поведение?
  • Есть ли способ получить [AB, A, B] ?

Ожидаемый результат. (A|B)+ сопоставляет и захватывает A , помещает значение соответствия в буфер группы 1, а затем фиксирует B (как + совпадает один или несколько раз) и помещает значение в группу 1, переписывая A внутри .

Таким образом, единственный способ получить то, что вам нужно, – это захватить как A и B , но это не так просто.

Видеть

 println(Regex("(?:(A)|(B))+").matchEntire("AB")!!.groupValue‌s) 

См. Демо-версию Kotlin .

Он выводит [AB, A, B] , поскольку вся строка соответствует регулярному выражению, значение добавляется как первый элемент, Capture 1 добавляется как второй элемент, а Capture 2 – это третий элемент.

Но если у вас длинная строка, например, 123abc456def и у вас есть (?:(\d+)|(\p{L}+))+ , вы потеряете все снимки, но в последний раз . Итак, для ввода 123abc456def вы получите [123abc456def, 456, def] .

Однако вы должны предоставить более подробную информацию, если вам нужно сопоставить такие строки.