2014-10-30 4 views
1

Я пытаюсь извлечь конкретное строковое значение из строки в формате JSON в Scala. Однако это будет использоваться в производственной среде, поэтому меня беспокоит эффективность. В настоящее время я сейчас использую бит кода ниже:Извлечь только первое совпадение с Regex в Scala

val r = """identifier=\{S: ([\w\.]+),""".r 
var identifier: String = ""; 
r.findAllIn(queryResult toString).matchData foreach { 
    m => identifier = m.group(1) 
} 

Моя забота об эффективности. Мне не нужно проверять сам JSON (который создается AWS, поэтому я предполагаю, что это хорошо, и даже если это не так, я не могу его изменить), поэтому нет веских оснований для того, чтобы пройти все накладные расходы разобрать его.

Сказанное: могу ли я сделать это более эффективно с помощью регулярного выражения, или мне нужно будет спуститься до уровня обнаружения первого появления «идентификатора = {S:», затем следующего появления «,» после что, и получить подстроку между ними? Я пытался что-то сделать с r.findFirstIn, но я не могу понять, как извлечь из этого группу.

Или есть какая-то другая сверхэффективная вещь, о которой я не знаю, что я мог делать?

+5

Так как это в производственной среде, используйте парсер JSON, пожалуйста. – nhahtdh

+2

Лучше использовать хорошо зарекомендовавший себя парсер, чем попытаться разобрать его самостоятельно с помощью регулярного выражения. Преждевременная оптимизация <Заполненность –

+0

Насколько велика ваша строка json? Также 'identifier = somestring' выглядит как строковое значение внутри json. Было бы намного яснее, если вы можете поделиться образцом json, с которым имеете дело. – tuxdna

ответ

0

Вы хотите первый матч:

r.findFirstMatchIn(queryResult.toString).map(_.group(1)) 

(будет Option[String].)

То есть, я хотел бы использовать потоковое JSON анализатор каждый раз по регулярному выражению. Да, регулярное выражение выполняется быстрее, но если это не действительно узким местом, я бы больше беспокоился о точности.

+0

Neater использовать 'r.unanchored',' s match {case ru (g) ​​=>} ' , Нажмите треугольник по адресу: http://www.scala-lang.org/files/archive/nightly/2.11.x/api/2.11.x/index.html#[email protected]:scala.util .matching.UnanchoredRegex –

Смежные вопросы