Вы можете l oop массив, и если есть только одно совпадение, используйте findFirstMatchIn
.
Шаблон, который вы используете, очень широк, и вы можете сделать его немного более конкретным c например, начиная совпадение внутри группы захвата с uri:
Regex demo | Scala demo
Например,
val array = Array (
"Output(RequiredSystemOutput(2017-05-21 13:43:59,085 [scala-execution-context-global-43] ERROR Database - Error executing database store for URI (uri:becbfx08-c491-44e3-bd01-d12c0305bcbf,offset:12054350) for transition to state FileArchived : Could not acquire connection-1 - Connection is not available, request timed out after 15000ms.,2020-01-21 13:43:59.086 GMT)) }}",
"Output(RequiredSystemOutput(2017-05-21 13:43:59,085 [scala-execution-context-global-43] ERROR Database - Error executing database store for URI (uri:becbfx08-c491-44e3-bd01-d12c0305bcbf,offset:12054350) for transition to state FileArchived : Could not acquire connection-1 - Connection is not available, request timed out after 15000ms.,2020-01-21 13:43:59.086 GMT)) }}"
)
val pattern = """\((uri:[^()]+)\)""".r
val res: Array[String] = for {
s <- array
m <- pattern.findAllMatchIn(s)
} yield m.group(1)
res.foreach(println)
Выход
uri:becbfx08-c491-44e3-bd01-d12c0305bcbf,offset:12054350
uri:becbfx08-c491-44e3-bd01-d12c0305bcbf,offset:12054350
Чтобы получить более точное соответствие c, Вы можете использовать класс символов и повторить предыдущий дефис:
\((uri:[a-z0-9]+(?:-[a-z0-9]+)+,offset:[0-9]+)\)
Regex demo