我正在使用一个无法更改的客户端,它向我发送了如下数据:
"BOOKING - PAID (price.amount=70, price.currency=EUR)"
,我只想从中获取70 EUR
在Kotlin中做这种事情的最好方法是什么?我没有找到String的任何removeAll("", "", ...)
函数,只能替换但必须链接它们以同时删除price.amount
和price.currency
。
编辑:
实际上需要预订-付费(70 EUR),忘了那部分。
答案 0 :(得分:2)
这听起来像是正则表达式的工作!
fun main(args: Array<String>) {
val str = "BOOKING - PAID (price.amount=70, price.currency=EUR)"
// The expressions between parentheses will map to groups[1], groups[2] and groups[3] respectively
val reg = Regex("""(.*) \(price\.amount=([0-9]+), price\.currency=([A-Z]+)\)""")
// Apply the regular expression on the string
val results = reg.find(str)
results?.groupValues?.let { groups ->
// If results and groupValues aren't null, we've got our values!
val type = groups[1]
val price = groups[2]
val currency = groups[3]
println("$type ($price $currency)") // BOOKING - PAID (70 EUR)
}
// Or as suggested by @Roland:
results?.destructured?.let { (type, price, currency) ->
println("$type ($price $currency)") // BOOKING - PAID (70 EUR)
}
}
使用正则表达式可以将字符串作为条目,并在其中查找模式。它们在所有语言中都已广泛使用,您可以在各地找到有关它们的更多信息。
编辑:针对更新的问题进行编辑。我选择将"BOOKING - PAID"
视为单个字符串,但是有无数种方法可以实现,具体取决于您的粒度需求;老实说,在这一点上,正则表达式可能有点过大了。 :)
答案 1 :(得分:2)
考虑一下,当您更新问题以仅从字符串中真正删除一部分时,以下是从给定字符串中删除多个字符串的一些方法:
使用正则表达式:
input.replace("""(price\.(amount|currency)=|,)""".toRegex(), "")
使用要删除的字符串列表:
sequenceOf(input, "price.amount=", ",", "price.currency=")
.reduce { acc, rm -> acc.replace(rm, "") }
// alternatively using var:
var input = TODO()
sequenceOf("price.amount=", ",", "price.currency=")
.forEach { input = input.replace(it, "") }
还是:大多数时候,我宁愿走另一条路:提取所需的信息,然后像Baptiste has shown in his answer那样打印出来。否则,您可能会开始公开您不想公开的服务的答案。
答案 2 :(得分:1)
没有通过字符串操作的正则表达式,并假定这是模式:
fun main(args: Array <String> ) {
val str = "BOOKING - PAID (price.amount=70, price.currency=EUR)"
val type = str.substringBefore("(").trim()
val price = str.substringBeforeLast(",").substringAfter("=")
val currency = str.substringAfterLast("=").substringBefore(")")
val result = "$type ($price $currency)"
println(result)
}
将打印
BOOKING - PAID (70 EUR)
编辑:我使用str.substringBeforeLast(",")
来获取价格,以防,
可以用作数字中小数部分的分母