Кортежи из строки по регулярным выражениям в Scala - PullRequest
1 голос
/ 02 апреля 2012

У меня есть строка типа {param1=foo}{param2=bar}hello world!
Мне нужно извлечь массив кортежей (paramName, value) из этой строки и получить что-то вроде [(param1, foo), (param2, bar)]

Возможно ли этов Scala, чтобы извлечь эти кортежи только одним регулярным выражением?Потому что мне удалось сделать это только таким образом, как

val str = "{param1=foo}{param2=bar}hello world!"
val param = """(?<=\{)(.+?)(?=\})""".r // extract everything between { and }
val keyValue = """(.+)=(.+)""".r // for extracting key and value
val parameters = for (keyValue(key,value) <- param.findAllIn(str).toArray) 
                     yield (key,value)

И это не выглядит мило.

Также я пытался использовать

val param = """(?<=\{)(.+?)=(.+?)(?=\})""".r

Но это возвращениеparam=value как одна строка

Ответы [ 2 ]

4 голосов
/ 02 апреля 2012

Вот выражение, которое найдет такие вещи, как {A=B}, где A и B не содержат {, } или =.

scala> val Re = """\{([^{}=]+)=([^{}=]+)\}""".r

scala> val Re(a,b) = "{param1=foo}"
a: String = param1
b: String = foo

И если выхочу найти все совпадения в строке:

scala> val s = "{param1=foo}{param2=bar}hello world!"

scala> Re.findAllIn(s).matchData.map(_.subgroups).toList
res9: List[List[String]] = List(List(param1, foo), List(param2, bar))
2 голосов
/ 02 апреля 2012

Без регулярных выражений вы можете сделать:

scala> val str = "{param1=foo}{param2=bar}hello world!"

scala> str split '}' filter(x => x.head =='{' && x.contains('=')) map{x => val Array(key, value) = x.tail split '='; key -> value }
res9: Array[(java.lang.String, java.lang.String)] = Array((param1,foo), (param2,bar))

Или более понятным способом:

// We find different blocks
val str1 = str split '}'

// We remove invalid blocks (end of the String in your case)
val str2 = str1 filter(x => x.head == '{' && x.contains('='))

// We transform the String into a tupple, removing the head
val str3 = str2 map{x => 
  val Array(key, value) = x.tail split '='
  key -> value
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...