我有{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
作为一个字符串
答案 0 :(得分:4)
这是一个表达式,可以找到{A=B}
,其中A
和B
不包含{
,}
或{{ 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
}