繁体   English   中英

从Scala字符串中提取令牌的快速方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM