Scala - цикл по массиву и применение регулярных выражений - PullRequest
1 голос
/ 06 февраля 2020

У меня есть массив сообщений журнала. Пример сообщения в массиве ниже -

Пример ниже -

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)) }}

Итак, представьте вышеизложенное, но повторяющееся. Я хотел бы провести l oop через массив отдельных сообщений журнала, чтобы вместо распечатки всего сообщения для каждого из них выводились только URI и смещение, например:

uri:becbfx08-c491-44e3-bd01-d12c0305bcbf,offset:12054350

У меня есть регулярное выражение val regex = "\\(([^()]+)\\)", но я изо всех сил пытаюсь применить это в Scala, особенно в массиве.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Вы можете 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

0 голосов
/ 06 февраля 2020

Я не уверен, что регулярное выражение, которое вы упомянули в своем коде, поможет, потому что вы предоставили только один пример. Могу привести более избирательный для данного примера.

val string = "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 regex = "\\((uri\\:[0-9a-zA-Z\\-]+,offset\\:[0-9]+)\\)".r

val matchOption = regex.findFirstMatchIn(string)

val extractedStringOption = matchOption.map(_.group(1))
// extractedStringOption: Option[String] = Some(uri:becbfx08-c491-44e3-bd01-d12c0305bcbf,offset:12054350)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...