Scala中由正则表达式的字符串组成的元组

时间:2012-04-02 14:46:45

标签: regex scala

我有{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 个答案:

答案 0 :(得分:4)

这是一个表达式,可以找到{A=B},其中AB不包含{}或{{ 1}}。

=

如果你想在字符串中找到所有匹配项:

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

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

答案 1 :(得分:2)

如果没有正则表达式,你可以这样做:

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
}