[英]Fast way to extract tokens from scala string
给定一个scala字符串,其中包含一个键值对集合(键值对类型的顺序不固定,键值对的数量不固定):
val s = "key1: val1, key2: (val2.1, val2.2, val2.3), key3: (), key4: val4"
我需要将它们拉到一个不变的地图中,例如:
Map("key1" -> "val1",
"key2" -> "(val2.1, val2.2, val2.3)",
"key3" -> "()",
"key4" -> "val4")
我已经试过了:
val kvMap = s.split(", ").map(_.split(": ")).map(t => t(0) -> t(1)).toMap
但这失败了,因为括号和键值对之间使用了相同的定界符(逗号)。
我可以使用使用迭代的堆栈来做到这一点,但要避免这种情况。
我还尝试编写一个正则表达式,可以帮助我做到这一点,但可以使其仅适用于1对:
scala> val MyPattern = "([^=]*):(.*)".r
Pattern: scala.util.matching.Regex = ([^=]*):(.*)
^
scala> val MyPattern(k, v) = "key: value"
k: String = key
v: String = " value"
我正在寻找一种实用的方法来执行此操作。
如果你的键值对没有嵌套的括号,你可以使用正则表达式用逗号分割未遵循比其他任何字符+空格(
和)
高达)
:
""", (?![^()]*\))""".r
说明 :
,
-仅在以下情况下匹配逗号和空格 (?![^()]*\\))
-不跟non- )
和non- )
(0次或多次)后跟文字)
(即,如果不跟+ )
)。 如果您想尝试一种匹配的方法:
"""([^=:]*):\s*(.*?),?\s*(?=$|\w+:)""".r
看这个演示
详细资料 :
([^=:]*)
-组1捕获除=
和:
以外的0+个字符(由于键不能为空,因此*
应该用+
代替) :\\s*
-带有0+空格的冒号 (.*?),?\\s*
-除换行符外的任何字符(第2组(.*?)
)尽可能少,其后跟一个可选的,
+空格... (?=$|\\w+:)
-后面跟字符串或1个单词字符和一个冒号。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.